人に聞けない痔の悩み、これでスッキリ >>

Linuxのshellで、ftpを使ってデータを転送するシェルを作成しています。
転送部分はうまくいき、エラー制御を考えているのですが上手くいきません。(ログは取得できてます)
やりたいことは、ftp転送で失敗したかどうかの判定をしたい。ということです。

過去ログ等見ていて、ログファイルからエラーNoをgrepして判断する。というやり方があったので
試して見ましたが、構文が正常に書けていないようです。すみませんがアドバイスをお願い致します。

ftp転送終了したとします。 ログは $Log_Path/$date.txt にとってあります。

grep ^425 $Log_Path/$date.txt /dev/null
if $? eq 0
then
error_flag=1
exit 1
fi

(エラーが発生したら、error_flagに1が入るようにしたい)

エラーナンバーは425(データコネクションをオープンできない)というやつで、いいかなと思っていますが、もっと適切なものがあれば教えて下さい。(putで行っている転送の失敗を判断できればいいです)

上記の構文ではエラーが出ます。
また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか?

宜しくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

grepは、一致した行を画面に出力してしまうので、それを見たくない場合は煩わしい。

そのような時には画面出力を捨てます:

grep ^425 $Log_Path/$date.txt > /dev/null

不等号記号 ">" に注意して下さい。これは「標準出力を /dev/null というファイルに出しなさい」という意味です。不等号記号は「リダイレクション」という機能ですから、詳しくはリダイレクションの使い方を調べてみてください。また、/dev/null がどういうファイルかも、シェルプログラミング関連で調べられると思います。

あるいは、grep に "-q" (quiet) オプションがあれば、

grep -q ^425 $Log_Path/$date.txt

で同じ効果が得られるんじゃないかと思います。

また、"if" は、コマンドを実行しその戻り値を利用するのですから、"if" の直後はコマンドです。従って、

if test $? eq 0

と書きます。"test" というコマンドに "$? eq 0" という式の真偽を計算させるのです。

さらに、それで悪くはないのですが、どうせコマンドの戻り値を使うなら、"if" の後に直接 grep を書いてやればいいじゃないか . . . ということになります。

また、error_flag=1 としたあとに、exit していますが、それではせっかく設定した変数error_flagが無駄になってしまいませんか?

以上のことを考えると

if grep ^425 $Log_Path/$date.txt > /dev/null
then
exit 1
fi

になると思います。あとは、個人の好みですが、僕だったらもっと簡潔に

(grep ^425 $Log_Path/$date.txt > /dev/null) && exit 1

と書くと思います。

最後にですが、ftpなどの、本来は対話的に使うように出来ているコマンドをスクリプトで使うのは結構辛いです。そこで、"expect" という、対話コマンドをスクリプトから使うためのコマンドもあります。ずっと昔使っていただけで、使い方は忘れてしまいました。また、転送が失敗したかどうか知りたいだけだったら、wgetをftpコマンドの代わりに使う方がずっと楽かも知れません。
    • good
    • 1
この回答へのお礼

とても丁寧な回答ありがとうございます。
非常に解りやすく、参考になりました。
意味のわかっていなかった部分も改善できました。

アドバイスいただいた内容で試して見たいと思います。
ありがとうございました。

お礼日時:2012/08/31 14:11

たぶんで申し訳ないんですが、対話的に使用するftpコマンドよりも


wgetコマンドを使用したほうがいいと思います。
ログをgrep することなく、wgetコマンドの直後に $? の比較で
済むと思います。
    • good
    • 0

>(エラーが発生したら、error_flagに1が入るようにしたい)



そのerror_flagは何者です?
シェル内の変数ですか?
環境変数ですか?
# どちらにしろ、exitで抜けているので意味ありませんが…。
# シェル内で環境変数を変更しても、親プロセス(呼び出し側)には影響しなかった…かと。
呼び出し側でエラーによる分岐をしたいのであればexitで返却する終了コードで分岐すべき…かと思います。

>上記の構文ではエラーが出ます。

どういうエラーが出ますか?

>また、 /dev/null の部分が意味が解っていません。この部分の説明をお願いできますでしょうか?

なんか抜けていませんかね?
grep ^425 $Log_Path/$date.txt > /dev/null
なんじゃないですか?

/dev/nullへのリダイレクトなら、grepの出力結果を捨てる。というだけです。
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

また、提示情報が不足しておりもうしわけありませんでした。
他の方かも頂いた回答で解決できそうです。

ありがとうございました。

お礼日時:2012/08/31 14:12

正しくは



grep ^425 $Log_Path/$date.txt > /dev/null
if [ $? -eq 0 ];
then
#error_flag=1
exit 1
fi

だと思います。
grepは正規表現に該当した行を出力するので、それを「 > /dev/null」で表示させないようにします。
ifの比較の文も変更しています。スペースに注意して下さい。
error_flag=1とexit 1ですがどちらか一つにして下さい。
シェルの実行方法は
A) ./aaa.sh
B) source ./aaa.sh
の二通りありますが、Aではサブシェル内で実行され、Bでは現在のシェル内で実行されます。
Aではerror_flag=1が現在のシェルに引き継がれないので、意味を持ちません。
Bではexit 1で現在のシェルを終了させてしまいます(要するにコマンドプロンプトが閉じる)。
    • good
    • 0
この回答へのお礼

迅速な回答ありがとうございました。
不明点も明確になり、理解が増しました。

基本的な部分がわかっておらず申し訳ありません。
徐々に改善していければと思います。

ありがとうございました。

お礼日時:2012/08/31 14:13

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QシェルスクリプトでFTPの実行結果を取得するには

OS redhat linux
シェル bornシェル

でftpを実行するスクリプトを作っていますが、
ftpの実行結果は取得できるのでしょうか?

ftp -n < ftpCom.txt

宜しくお願いします。

Aベストアンサー

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラーが発生しました" >> logfile
exit 1
fi

みたいなことをしていました。grep の引数 ^226 は行頭が226から始まる行を検索、という意味で、grepでマッチする行があった場合は0が戻り値となり、マッチしなければ0以外が戻り値となるので、それを利用していました。

実際の運用では、処理が異常終了したときにlogfileを見て、FTPのエラーだったらさらにftpLog.txtを見る、みたいな感じでした。

なお、FTPサーバが返すコードについては下記RFCの4.2辺りを参照してください。もっとも、サーバによってこれら全てが実装されてるとは限りませんが。

http://hp.vector.co.jp/authors/VA002682/rfc959j.htm

No.1です。補足拝見しました。

直接ftpコマンドの戻り値では実行結果が判断できないので、私が以前に携わっていたプロジェクトでは、FTPサーバが出すエラーコードをgrepでハンドリングしていました。

FTPはコマンドの結果を「行頭に3桁の数字」で出力する仕様になっており、putもgetも送受信が成功した場合は226が出力されるので、

ftp -nv < ftpCom.txt > ftpLog.txt 2>&1

を例えにとると、このコマンドを実行した後に、
grep ^226 ftpLog.txt > /dev/null
if $? ne 0
then
echo "FTPでエラー...続きを読む

Qftpコマンドの戻り値をチェックしたい

現在業務でftpコマンドを用いたバックアップシェルを作成しております。(RHEL4)
クーロンでシェルAを呼び、シェルA内でftpコマンド発行→ファイルB内のftpコマンドを実行→シェルAに戻る、という仕様ですが、このftpコマンドが成功したのか失敗したのかをプログラム上で判断する方法はありますでしょうか?

Aベストアンサー

shogo0809さんの回答に便乗します。
実行ログをファイルに落としてgrepするのがよいと思います。
以前、似たような質問があったので
具体的な手順は参考URLのほうを見てはどうでしょうか?

→シェルスクリプトでFTPの実行結果を取得するには

参考URL:http://oshiete1.goo.ne.jp/qa2656080.html

QFTPコマンドの戻り値について

UnixのシェルでFTPを行っていますが、
接続不可の時にエラーの戻り値を取りたいと考えています。

ただ、

OPEN XXX
user aaa acount bbb
get ファイル名 取得先/ファイル名
bye

というシェルを実行した場合、接続先XXXが有り得ない場合、
戻り値($?)が0以外かと思っていたのですが、表示させると0になっていました。
接続できません、というメッセージは表示されるのですが。。。
戻り値でエラーを判断する方法をご存知の方、よろしく
お願いします。

Aベストアンサー

こんにちわ。
当方ではftpを自動実行する際、以下のようにしてます。

以下、シェルの内容
------------------------------------------------------------------
#!/bin/csh
ftp -n ホスト名 <<EOF >& 標準エラー出力リダイレクトファイル名
user aaa acount bbb
get ファイル名 取得先/ファイル名
bye
EOF

if (-z 標準エラー出力リダイレクトファイル名) then
exit(0)
else
exit(1)
endif
------------------------------------------------------------------
以上、シェルの内容

簡単に言うと、ftpコマンドにてエラーが発生するとそれらは標準エラー出力
に出力されるので、それをリダイレクトしてファイルサイズが0バイトであれ
ばエラーがなかったと判断しています。
エラーが発生した場合は、そのリダイレクトしたファイルを見れば内容がわかります。
今のところ問題なく動作しています。

こんにちわ。
当方ではftpを自動実行する際、以下のようにしてます。

以下、シェルの内容
------------------------------------------------------------------
#!/bin/csh
ftp -n ホスト名 <<EOF >& 標準エラー出力リダイレクトファイル名
user aaa acount bbb
get ファイル名 取得先/ファイル名
bye
EOF

if (-z 標準エラー出力リダイレクトファイル名) then
exit(0)
else
exit(1)
endif
------------------------------------------------------------------
以上、シェルの内...続きを読む

Qシェルでftp接続によるファイル取得について

以下のようなシェルスクリプトを作成しましたが、
(file-name) get: No such file or directory
(file-name) done: No such file or directory
のエラーメッセージが出てしまい、うまくいきません。
OSはLinux(FedoraCore4)です。
どうやらファイル名の取得がうまくいかず、エラーになっている
様です。
試しに直接ファイル名を指定して書くと、無事ファイルを
取得できます。

エラーの原因がお分かりになる方、どうぞ宜しくお願い致します。



-----------------------------------------------
#!/bin/sh

cd /local_test/log/
ftp -n xxx.xxx.xxx.xxx<< _EOF
user test_user test_pass
cd /test/log/
ascii
prompt

for i in *.log
do
chmod u+r $i
get $i
chmod u-r $i
done
bye
_EOF
exit 0
-----------------------------------------------

以下のようなシェルスクリプトを作成しましたが、
(file-name) get: No such file or directory
(file-name) done: No such file or directory
のエラーメッセージが出てしまい、うまくいきません。
OSはLinux(FedoraCore4)です。
どうやらファイル名の取得がうまくいかず、エラーになっている
様です。
試しに直接ファイル名を指定して書くと、無事ファイルを
取得できます。

エラーの原因がお分かりになる方、どうぞ宜しくお願い致します。



-----------------------------------------------
...続きを読む

Aベストアンサー

こんにちは、ham_kamoです。
ls *.logの結果で、ls -l と同じ表示が出てしまいましたか。
環境によって違うものなのですね。私が以前に使用していたサーバではファイル名一覧だけ出てきたのですが。
No.3の方が書いている
quote site chmod u+r *.log
という書き方も、そのサーバではエラーになっていました。(なのでややこしいスクリプトを書いたしだいなのですが)
もしお使いのサーバでは、上の書き方でエラーがならないのであれば、No.3の方の回答で済むと思います。

一応、それがエラーになってしまうから、という前提で、スクリプトに手を修正しました。さらにワンクッション置いて、ファイル名だけを抜き出して取得するようにしてみました。(テンポラリファイルがまた1つ増えました。。。)

以下のスクリプトで試してみていただけますか?

#!/bin/sh

cd /local_test/log/
tmpfile=/tmp/ftptmp.$$
tmpfile2=/tmp/ftptmp2.$$
tmpfile3=/tmp/ftptmp3.$$
tmpfile4=/tmp/ftptmp4.$$

cat > $tmpfile << _EOF
user test_user test_pass
cd /test/log/
ascii
prompt
_EOF

cp $tmpfile $tmpfile2
cat >> $tmpfile2 << _EOF
ls *.log
bye
_EOF

ftp -n xxx.xxx.xxx.xxx < $tmpfile2 | grep .log | grep -v '*.log' > $tmpfile3
awk '{print $NF}' $tmpfile3 > $tmpfile4

for i in `cat $tmpfile4`
do
cat >> $tmpfile << _EOF
quote site chmod u+r $i
get $i
quote site chmod u-r $i
_EOF
done

echo "bye" >> $tmpfile

ftp -n xxx.xxx.xxx.xxx < $tmpfile
rm $tmpfile $tmpfile2 $tmpfile3 $tmpfile4
exit 0

こんにちは、ham_kamoです。
ls *.logの結果で、ls -l と同じ表示が出てしまいましたか。
環境によって違うものなのですね。私が以前に使用していたサーバではファイル名一覧だけ出てきたのですが。
No.3の方が書いている
quote site chmod u+r *.log
という書き方も、そのサーバではエラーになっていました。(なのでややこしいスクリプトを書いたしだいなのですが)
もしお使いのサーバでは、上の書き方でエラーがならないのであれば、No.3の方の回答で済むと思います。

一応、それがエラーになってし...続きを読む

QFTPの送信結果を検知したい

WindowsでFTPをバッチファイルから呼び出すことを考えています。FTPで送信エラーが発生した場合に、FTPのエラーとして検知したいのですが、その方法をご存じのかたおりましたら教えて下さい。(Windows-NTで標準で提供されるFTPを使用しています)直接私が確認したわけではありませんが、FTP送信でエラーが発生してもFTPの終了コードが0になってしまうらしく、FTPのエラーを検知できないそうです。WindowsであればWindows-NT以外の環境でもかまいませんので、ご存じのかたおりましたら教えて下さい。

Aベストアンサー

標準のツールでやるなら、ftpコマンドの出力をファイルにリダイレクトして、find か findstr コマンドで適当な文字列の有無で判断するしかないですね。

>FTPで転送後に転送先のホスト内のある処理が自動的に動き
とのことですが、転送先ホストで単純にデータファイルの有無で先に進むと、転送途中のファイルを読んだり、転送エラーで途中で終わったファイルを読んだりする可能性があるので、普通は、転送元でデータファイルの正常転送を確認後に目印ファイル(中身は空でよい)を送り、転送先では目印ファイルがあることでデータファイルが正しく受信できたことを判断して目印ファイルを消して先に進む(データファイルを処理する)のが良く使われる手法です。

Q-bash: ftp: コマンドが見つかりません

ftpでファイルを転送したいのですが、現在出来ておりません。
因みにその端末(サーバ)は外部からのftpのやり取りも必要な為、vsftpdをインストールしています。
試しに、コマンドでftpと入力した時に題目のようなエラーが表示されます。

Linuxはまだ経験が殆ど無く、シェルに関してもまだ分かりません。

ftpクライアントのインストールとか必要でしょうか?
それとも何か追加設定が必要でしょうか?

途中のファイアーウォール機器では通過の設定ができております。

教えていただけますでしょうか。
宜しくお願い致します。

Aベストアンサー

echo ${PATH}

として、パス(コマンドサーチパス)を確認してみてください。

その上で、

find / -name ftp -print > /tmp/find.log

として、「ftp」コマンドがどこのディレクトリにあるかを確認してください。
※ エラーメッセージ(~:許可がありません)が出力されますが、無視してください。

cat /tmp/find.log

/usr/kerberos/bin/ftp
/usr/bin/ftp


そのあとで、「/etc/profile」に、「ftp」コマンドが存在するディレクトリを追記してください。

最終行に追加
PATH=/usr/kerberos/bin:/usr/bin:$PATH

いったん、ログアウトしてログインして、パスが追加できてるかを確認してください。
echo ${PATH}

追加できてれば、「ftp」コマンドが使えるようになっているはずです。

Qftpコマンド出力結果の取得

ftpコマンドのバッチ処理によってファイルの一覧の結果を取得したいのですが、
リダイレクション等を用いても取得できません。
どのようにすればいいか教えてください。

**************状況*************
OSおよびOSレベル:AIX5.2
シェル:Kシェル

コマンドファイルの中身(ftp.txt)
cat << EOF | ftp -n
open SERVER
user USER PW
cd PATH
ls -l
bye
EOF

SERVER:実際のサーバー名
USER:実際のユーザー名
PW:実際のパスワード
PATH:実際のパス

これを以下のように実行し、結果を取得しようとしました。
# ./cmd.ftp > log

しかし、出力ファイルlogの中身はカラっぽでした。

ところが、リダイレクションを外し、コマンドファイルのみを実行すると、結果が画面に表示されます。

何故、画面には表示されるのに、リダイレクションやパイプでは結果が渡されないのかが分かりません。

ftpコマンドのバッチ処理によってファイルの一覧の結果を取得したいのですが、
リダイレクション等を用いても取得できません。
どのようにすればいいか教えてください。

**************状況*************
OSおよびOSレベル:AIX5.2
シェル:Kシェル

コマンドファイルの中身(ftp.txt)
cat << EOF | ftp -n
open SERVER
user USER PW
cd PATH
ls -l
bye
EOF

SERVER:実際のサーバー名
USER:実際のユーザー名
PW:実際のパスワード
PATH:実際のパス

これを以...続きを読む

Aベストアンサー

以前の質問に答えてから、手動でやってもできるなと気付きました。creさんの環境でできるか分かりませんが、試してみてください。
コマンドラインから、
ftp SERVER | tee ftp.log
としてください。あとは普通に手動でftp操作をします。ただし私の環境では、ログイン時のユーザ名入力のプロンプトが表示されませんでしたが、表示されているものとしてユーザ名を入力したら、パスワードを聞いてきました。あとは普通にftp操作をして終了すれば、全ての操作履歴がftp.logに記録されます。

結果報告お待ちしてます。

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

Qshスクリプトでftp接続してファイル転送したい

テキストファイルの1行の文字列を読込んで
ftpで、文字列と同名のファイルを別サーバに転送する
shスクリプトを作成したいと思っています。

テキストファイルから読込んだ文字列を変数に格納して
ftp接続後、putで変数を指定すると
『変数名のファイルがありません』
というエラーがでます。

エラーメッセージから、変数が変数として扱われていない。
ファイル名そのものとして扱われていると思います。

テキストファイルから読込んだ文字列をftpで使用するには
どうしたらよいでしょうか?
また、何か代替案はあるのでしょうか?


簡略化したshスクリプトの内容は以下の通りです。
------------------------------------
#!/bin/sh

read filename <./test.txt

ftp -n host_name <<"EOD"
user user_name password
passive
binary
cd /export/test
put filename
bye
EOD
-----------------------------------

テキストファイルの1行の文字列を読込んで
ftpで、文字列と同名のファイルを別サーバに転送する
shスクリプトを作成したいと思っています。

テキストファイルから読込んだ文字列を変数に格納して
ftp接続後、putで変数を指定すると
『変数名のファイルがありません』
というエラーがでます。

エラーメッセージから、変数が変数として扱われていない。
ファイル名そのものとして扱われていると思います。

テキストファイルから読込んだ文字列をftpで使用するには
どうしたらよいでしょうか?
ま...続きを読む

Aベストアンサー

どもです。

え~っと、このような時にはexpectという言語を
使うのが便利が宜しいです。まぁ、perlとかでも
同じような事が出来ますが、、、

で、expectを使用する場合、実環境でコードを
書かないとつらいものがあります。
一応、サンプルを以下に乗せますが、多分動作
しないでしょう。

expect "XX"
となっているところは、FTPで接続しているときに
表示される文字列が来るまで待つって意味なので、
XX
が来るまで待つって感じです。

#!/usr/local/bin/expect

if { $argc < 1} {
puts "Error"
exit 1
}

set fname [lindex $argv 0]

# 要修正
spawn ftp 192.168.100.135

# 要修正 ユーザー名
expect "Name"
expect ":"
send "hogeuser\r"

# 要修正 パスワード
expect "Password:"
send "hogepwd\r"

expect "ftp>"
send "passive\r"
expect "ftp>"
send "binary\r"
expect "ftp>"
send "cd /export/test\r"
expect "ftp>"
send "put $fname\r"
expect "ftp>"
send "bye\r"
expect eof

どもです。

え~っと、このような時にはexpectという言語を
使うのが便利が宜しいです。まぁ、perlとかでも
同じような事が出来ますが、、、

で、expectを使用する場合、実環境でコードを
書かないとつらいものがあります。
一応、サンプルを以下に乗せますが、多分動作
しないでしょう。

expect "XX"
となっているところは、FTPで接続しているときに
表示される文字列が来るまで待つって意味なので、
XX
が来るまで待つって感じです。

#!/usr/local/bin/expect

if { $argc < 1} {
puts ...続きを読む


人気Q&Aランキング