社内SEの徒然なる日記

スクリプトで実行したFTPのmgetコマンドが動作しない

■ FTP

久しぶりに、FTPをコマンド(PowerShell)から実行させようとしました。

すっかり書き方を忘れていたので、以前書いて運用中の別のスクリプトからコピペしたのですが、mgetを発行したところで処理が止まってしまいました。

スクリプトは、大体こんなイメージです。
# FTPコマンド(このスクリプトと同じ場所)
[System.String]$ftpCommandFile = 'D:¥bbb¥FTPCmdFile.txt'

# FTPコマンド削除(再処理対応)
if ((Test-Path $ftpCommandFile) -eq $True) {Remove-Item $ftpCommandFile -Force}

# FTPコマンド作成
Write-Output 'open 10.100.90.55' | out-file $ftpCommandFile Default -append
Write-Output 'root' | out-file $ftpCommandFile Default -append
Write-Output 'rootpass' | out-file $ftpCommandFile Default -append
Write-Output 'ascii' | out-file $ftpCommandFile Default -append
Write-Output 'prompt' | out-file $ftpCommandFile Default -append
Write-Output 'cd /var/adm/log' | out-file $ftpCommandFile Default -append
Write-Output 'lcd D:¥bbb¥log' | out-file $ftpCommandFile Default -append
Write-Output 'mget *' | out-file $ftpCommandFile Default -append
Write-Output 'quit' | out-file $ftpCommandFile Default -append

# FTP実行
FTP -i -s:$ftpCommandFile

# FTPコマンド削除(ゴミ掃除)
if ((Test-Path $ftpCommandFile) -eq $True) {Remove-Item $ftpCommandFile -Force}


コマンドを記述したファイル自身も、このスクリプトで生成しています。これで動くと思ったのですが、実際には「mget *」で処理が停止してしまいます。

異常終了するわけでもなく、停止です。なにやら応答を待っている感じです。

■ 回答

まぁ、知ってる人が見たら失笑モノのミスでしたね。はい、promptが余計でした。

先ほどのスクリプトから1行コメントアウトして再実行します。
# FTPコマンド(このスクリプトと同じ場所)
[System.String]$ftpCommandFile = 'D:¥bbb¥FTPCmdFile.txt'

# FTPコマンド削除(再処理対応)
if ((Test-Path $ftpCommandFile) -eq $True) {Remove-Item $ftpCommandFile -Force}

# FTPコマンド作成
Write-Output 'open 10.100.90.55' | out-file $ftpCommandFile Default -append
Write-Output 'root' | out-file $ftpCommandFile Default -append
Write-Output 'rootpass' | out-file $ftpCommandFile Default -append
Write-Output 'ascii' | out-file $ftpCommandFile Default -append
#Write-Output 'prompt' | out-file $ftpCommandFile Default -append
Write-Output 'cd /var/adm/log' | out-file $ftpCommandFile Default -append
Write-Output 'lcd D:¥bbb¥log' | out-file $ftpCommandFile Default -append
Write-Output 'mget *' | out-file $ftpCommandFile Default -append
Write-Output 'quit' | out-file $ftpCommandFile Default -append

# FTP実行
FTP -i -s:$ftpCommandFile

# FTPコマンド削除(ゴミ掃除)
if ((Test-Path $ftpCommandFile) -eq $True) {Remove-Item $ftpCommandFile -Force}


これで、無事にダウンロード成功しました。

■ iオプション

ちなみに、promptはFTPコマンドを対話的に実行するかどうかを切り替えるもので、初期値はONです。promptを実行すると、OFFになるんですね。

ここで違和感。ONは対話的に実行する、OFFは応答なしで実行で初期値はON。コマンドで実行するなら応答出来ないので、OFFにしないといけません。なので、スクリプトだけを見れば、promptを発行するのは正しそうに見えます。

では、なぜこうなったかというと、FTPを発行する時に -i というオプションを付けたことが原因。このオプションを付けると、promptを発行したのと同じ効果になります。

iオプションが無かった場合、promptを発行するのが正解だったってことですが、コマンドで実行するのであれば、iオプションを付けて実行する方が正しいんでしょうね。

■ 後書き

ここ最近、セキュリティ上の問題があるということでFTPが敬遠されてきています。新しい方法も色々あるようですが、今一つ不便です。

何よりも、Windowsの標準機能として提供されていないのが困ります。結局、どこかからオープンソースとかの何かを探し出して使わないといけなかったりするのですが、それが本当に使って問題ないものなのか、確証が無いことが多いです。

ftpやtelnetがそうだったように、Windowsの標準機能だけでssh接続とか出来れば良いんですけどね。

・・・もしかしたら、私が知らないだけで出来るのかもしれませんけどね。

投稿記事の一覧:http://harikofu.web.fc2.com/

--- blog end --- スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する