Fedora4で下記のFTPコマンドをcronで実行したいとします。が、シェル(bash)で直接実行した時点でうまく動きません。proxy(ユーザー名@接続先)経由で、FTPは/usr/bin/ftpです。
ftp
open 192.168.1.1 21
username@FTPhostIP
password
ls
by
コマンドをひとつずつ叩いていくとちゃんと接続できます。
Yahoo! JAPAN
ftp -n 192.168.1.1 << _EOF
user username@FTPhostIP password
ls
by
_EOF
ftpをインタラクティブモードにすれば、動きませんでしょうか?
http://www.asahi-net.or.jp/~wv7y-kmr/memo/tips.html#lftp
PC-Unix 関係覚え書き
http://sonic64.com/cat_ftp.html
ftp - Landscape
ftp 以降はftpのコマンドプロンプト(というか)なのでbashにそのまま書いてもうまくいきません。
本当にやりたいことがわからないので(このままだと単にftpの出力としてlist出しておしまい)「定期的に外部のFTPサーバのリストを取ってその結果をどこかに保存する」だとすると、Fedoraだとlftpというコマンドがあるのでそれを利用した方がよいと思います。
まず、実行ユーザーのホームの.lftprcまたは/etc/lftp.confにあるftp:proxyのところをコメントアウトして質問の例なら
set ftp:proxy ftp://192.168.1.1
とします。
で、適当なスクリプトファイルに
open FTPhostIP -u username,password(実際にはopen 11.22.33.44 -u daresore, passwordみたいに書く)
ls > 出力先ファイル名
bye
を書き、
lftp -f scriptFile
で実行させます。
やりたいのは単純にあるファイルを定期的にFTPで上げたいんです。例には書きませんでした、すみません。
このぐらいの作業ならlftp使わなくていいのかなと思いまして・・・。lftpのほうが簡単なんでしょうか?
http://kamakura.cool.ne.jp/oppama/misc/shelltips.html
uebu: B�V�F����UNIX�R�}���h�̊o����������
やり方は色々あると思いますが、ftp -nで
ファイルからコマンドを読み込めばうまくいくと思います。
#!/bin/bash
umask 066
echo open 192.168.1.1 >> temp.txt
echo user username password>> temp.txt
echo ls >> temp.txt
echo by >> temp.txt
ftp -n < temp.txt
rm temp.txt
ありがとうございます。特に現象変わらず
usage: /usr/bin/ftp host-name [port]
password:name (192.168.1.1:FEDORAUSERNAME):
と返事が返ってきます。
現在FedoraCore4で自動的にサイトにファイルをアップロードするスクリプトを自分で作って使っています。
その時にかなり悩んだのですが、私の場合には実は呼んでるftpコマンドが
/usr/kerberos/bin/
にある物で
Please login with USER and PASS.
Please login with USER and PASS.
KERBEROS_V4 rejected as an authentication type
というエラーが出てました。
ただ、その後また繋がらなくなり結局lftpを使うことにしましたorz
現在使っているのは
#!/bin/sh
/usr/bin/lftp -f ~/ftpup
~/ftpupの内容
open 192.168.1.1
user ユーザ名 パスワード
put アップロードするファイル
quit
という内容のものです。
ありがとうございます。
試してみて「おおっ!」と思いましたが、「再接続を遅延しています」のまま延々繰り返しです。
手打ちしてみましたが同じメッセージです。
(手打ちと同じメッセージが出ただけでうれしい。orz)
のかった回答で恐縮ですが
open 192.168.1.1
user ユーザ名 パスワード
set ftp:passive-mode off
put アップロードするファイル
quit
とuserとputの間の行に入れてもだめでしょうか?
ありがとうございます。返事遅くなりましてすみません。Setコマンドいれてみましたがだめでした。
http://www.linux.or.jp/JM/html/netkit/man5/netrc.5.html
Manpage of NETRC
-nオプションの話が出ている時点でひょっとしたら検討済みなのかもしれませんが、念のため、.netrcファイルを作るという手もご紹介しておきます。
--
cat <<END >~/.netrc
machine 192.168.1.1
login username@FTPhostIP
password password
macdef init
ls
bye
END
chmod 400 ~/.netrc
--
とやっておいて、
ftp 192.168.1.1
で自動実行できるかと思います。
なお、URLのmanページにもありますが、.netrcファイルのパーミッションが緩いと自動ログインは中断してしまうはずなのでご注意ください。
ありがとうございます。残念ながらproxyで蹴られてしまうようです。421errorです。
http://www.nurs.or.jp/~sugi/netrc.htm
ftpの操作をマクロ登録する
私の場合はnetrcを使って自動化していました。
パーミッションの設定は忘れないようにして下さい。
ありがとうございます。
Macro definition missing null line terminator.
421 Service not available
だそうです。orz
追記:ググって.lftprcに
set ftp:proxy 192.168.1.1
set hftp:proxy 192.168.1.1
set ftp:use-hftp off
と書いてみたら「再接続を遅延しています」のメッセージはでなくなりました。
ただ、.netrcの「ls」や「by」のコマンドは実行できていない状態です。
lftp username@HostIP@ProxyIP:/>のプロンプトが出て、手打ちでのコマンドは動くようになりました!
追記2:すみません、上記は勘違いでした。
.lftprcに書いて
lftp 192.168.1.1
と実行したらログインまでできたということで、スクリプトファイルは読ませていませんでした。
読ませたところ「遅延しています」ではなく「データ接続を待っています」のメッセージです。
このままlftpで進行したいと思いますが、あと何が足りないんでしょう?
もう一手間お力を貸してください。
追記3:もっと進みました。
lftpでログインしてファイル(1個)をアップロードするまでに来ました。
スクリプトの中身はnyomonyomoさんのを参考にさせていただき
cd /home/test
put helloworld
quit
です。
helloworldをputしたところで「送受信の完了を待っています」となったままです。
これでちゃんと終了できれば出来上がりかも☆
lftpで行く方向にまとまりつつあるようですが、まだ回答受付中のようなので6番7番の回答に補足しておきます。
.netrcの最後にはマクロの終了を示す空行が必要ですが入っていますか? この空行がないと
Macro definition missing null line terminator.
と蹴られます。そのまま時間がたてば421になるでしょう。
ton-booさんありがとうございます。.netrcに空行入れたら動きました!解決です!
。
上記試して見ましたがダメでした。引数は-i -v -nもつけてみました。インタラクティブモードってmgetとか以外にこういう場合にも使うのですか?よく知らないんです。