旅先で恋に落ちたくなる?思わぬ運命の恋に巡り合う映画

Linuxで、あるftpサーバーにファイルをアップロードするシェルスクリプトを作る方法を教えてください。

例えば、このようなftpサーバーに対して、以下のスクリプトを作りました。

■ftpサーバー
ftpサーバー:ftp.hogehoge.jp
User-ID: user1
Password: password1

アップロードしたいファイル:test.html
アップロードしたい場所:/public_html

■シェルスクリプト
#!/bin/sh
ftp ftp://user1:password1@ftp.hogehoge.jp -u /public_html test.html

■結果
エラーも何も表示せず。



シェルスクリプトを、このようにすると、ftpサーバーにログインはできています。
#!/bin/sh
ftp ftp://user1:password1@ftp.hogehoge.jp

ここで、以下のように手でファイルをアップロードすることはできています。
ftp> cd public_html
250 CWD command successful.
ftp> put test.html
local: test.html remote: test.html
227 Entering Passive Mode (210,132,253,13,218,1)
150 Opening BINARY mode data connection for test.html
100% |*************************************| 62 270.29 KB/s 00:00 ETA
226 Transfer complete.
62 bytes sent in 00:00 (1.78 KB/s)

■環境
クライアント側
SuSE Linux 9.3


man ftpを見て、-uを使うのだと思ったのですが、間違ってますでしょうか?

よろしくお願いします。

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

A 回答 (1件)

-uが使えるなら、こうでは:


ftp -u ftp://user1:password1@ftp.hogehoge.jp/public_html/ test.html
    • good
    • 0
この回答へのお礼

ありがとうございます。教えてもらった方法で、ftpできました。
URLとディレクトリを別々に書くのだと思い込んでいました。

助かります。

お礼日時:2006/04/08 14:13

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

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

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

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

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 ...続きを読む

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

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

Aベストアンサー

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

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でエラー...続きを読む

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の方の回答で済むと思います。

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

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のmgetコマンドの自分の格納場所の指定方法は?

先日、ftpコマンドについてこのサイトで色々教えていただき感謝しております。

複数のファイルを受信するのにmgetコマンドを教えていただいたのですが、
相手より受信した場所の格納場所の指定が上手くいきません。

先方にFTPとしてログインでき、"PROMPT"→"MGET *"と行うのですが、受信したファイルの格納場所がCドライブの直下になってしまいます。
自分のインターネットサービスマネージャーの
ルートは別のフォルダに設定してあるのですが、これは受信したデータの初期値にはならないのでしょうか?
また、調べたところ省略すると、ワーキングディレクトリに作成されるみたいにかかれていましたが、ワーキングディレクトリはどこかで指定できるのでしょうか?

たとえばC:\AAAに受信したファイルを格納したい場合はどうやって書けばよいでしょうか?

MGET * C:\AAA見たいに色々試して見ましたが、駄目でした。

Aベストアンサー

方法は2つあります。

(1)データを格納するディレクトリに移動してからftpを起動させる。

cd 格納先ディレクトリ
ftp ホスト名
mget *

(2)ftpした後格納するディレクトリを指定する方法

ftp ホスト名
lcd 格納先ディレクトリ(自分のマシン)
mget *


lcd とは、"Local Change Directory" と思っておくと忘れなくていいですよ♪

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

QDirコマンドでフォルダ内ファイルの合計サイズをだすには?(コマンドプロンプトにて)

いろいろ調べましたが不明な点があり、質問します。

WindowsのDOSプロンプトでdirコマンドを打つとフォルダ・ファイルの一覧が表示されますが、その中にファイルサイズが表示されています。
このサイズを合計できるコマンドはありませんか?
DIRコマンドのオプションを調べましたがそれらしいものが見当たりません。
具体的には
C:\xxx\配下に50個程度のファイルがあります。
その50個の合計サイズを知りたいです。
xxxフォルダの親フォルダにはアクセス不可です。

ずーっと悩んでいます。よろしくお願いします。

なお、OSはWindowsNTか2000で使用予定です。

Aベストアンサー

カレントドライブ、カレントフォルダを
C:\xxx\
にした状態で、

dir /s /a-d

/sパラメータででサブディレクトリすべてを検索
/a-dパラメータでディレクトリ以外のファイル(つまり属性に関係なくすべてのファイル

これを実行すると最後にファイルの個数とファイルサイズの合計を表示します。

もし、隠し属性のファイルは合計しないのであれば、

dir /s

だけで良いと思われます。

Qshの停止方法

こんばんわ。

shの停止方法がわからなくて困っています。
sh(qqq.sh)の内容は
*******************
while true ;
do
sh xxx.sh
sleep 1
done
*******************
と、xxx.shを1秒ごとに起動するようにしています。
ですので、killコマンドでは1秒ごとに起動しているために早すぎてプロセスを停止できませんでした。

shのコマンドは
#sh qqq.sh &
で常駐するようにしました。

すごくこまっているのでご教授お願いします。

Aベストアンサー

>killコマンドでは1秒ごとに起動しているために早すぎてプロセスを停止できませんでした。

これはどういうことでしょう?sleepの間隔とkillできるか否かに相関はないと思うのですが。。。

ps -ax | grep qqq.sh
でqqq.shのプロセスIDを調べて、
kill プロセスID
それでも死ななければ
kill -KILL プロセスID
です。

QEXCELファイルのカレントフォルダを取得するには?

EXCELファイルのカレントフォルダを取得するには?

C:\経理\予算.xls

D:\2005年度\予算.xls

EXCEL97ファイルがあります。

VBAで
  カレントフォルダ名
(C:\経理\,D:\2005年度\)
を取得する事は可能でしょうか?

CURDIRでは上手い方法が見つかりませんでした。

Aベストアンサー

こんばんは。
Excel97 でも、同じですね。以下で試してみてください。

Sub test()
'このブックのパス
a = ThisWorkbook.Path
'アクティブブックのパス
b = ActiveWorkbook.Path
'Excelで設定されたデフォルトパス
c = Application.DefaultFilePath
'カレントディレクトリ
d = CurDir
MsgBox "このブックのパス   : " & a & Chr(13) & _
   "アクティブブックのパス: " & b & Chr(13) & _
   "デフォルトパス    : " & c & Chr(13) & _
   "カレントディレクトリ : " & d & Chr(13)
End Sub


人気Q&Aランキング