web-dev-qa-db-ja.com

スクリプトを介してsftp接続でコマンドを実行する

これは非常に基本的な質問です。私はbashを初めて使用するので、その方法を理解できませんでした。残念ながら、グーグルで移動することはできませんでした。

私の目標は、sftpを使用してサーバーに接続し、ファイルをアップロードしてから切断することです。

次のスクリプトがあります。

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins
#Change directory on server
#cd /home/kalenpw/TestWorld/plugins

#Upload file
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar

exit

問題は、このスクリプトがsftp接続を確立し、その後何もしないことです。手動で「exit」と入力して接続すると、putコマンドを実行しようとしますが、sftpセッションが閉じられているため、put:コマンドが見つかりませんでした。

これを正しく機能させるにはどうすればよいですか?

ありがとう

14
kalenpw

ヒアドキュメントでコマンドを渡すようにスクリプトを変更できます。たとえば、

#!/bin/bash

sftp -oPort=23 [email protected]:/home/kalenpw/TestWorld/plugins <<EOF
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar   
exit
EOF

<<マーカーとそれに続く名前(EOF)は、名前が(それ自体で)行の先頭で見つかるまで、後続の行を渡すようにスクリプトに指示します。

16
Thomas Dickey

scpの代わりにsftpを使用することをお勧めします。 scpは通常のcpコマンドと同じように動作しますが、ファイルをリモートにすることもできます。

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar [email protected]:/home/kalenpw/TestWorld/plugins

これにより、古い学校のftpスタイルのコマンドインターフェイスを使用せずに、ローカルマシン上のファイルがリモートマシン上のディレクトリにコピーされます。

sshscp、およびsftpサービスは、それらのいずれかが通常であれば利用可能です。同じデーモンプログラムがそれらすべてを同時に提供します。原則として、サーバーの管理者はそれらのいずれかを無効にすることを選択できますが、実際にはそれは非常にまれです。

5
db48x

sftp-bオプションを使用して、sftpのコマンドを含むファイルを示すこともできます。

たとえば、すべてのコマンドをファイルsftp_commands.txtに入れることができます。

cd /home/kalenpw/TestWorld/plugins
put /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar
exit

sftpを次のように実行します:

sftp -oPort=23 -b sftp_commands.txt [email protected]:/home/kalenpw/TestWorld/plugins 

または、ファイルを使用したくない場合は、STDINを介してコマンドを渡すこともできます。

man sftpから:

-bバッチファイル

バッチモードでは、stdinの代わりに入力バッチファイルから一連のコマンドを読み取ります。ユーザーとの対話がないため、非対話型認証と組み合わせて使用​​する必要があります。 「-」のバッチファイルは、標準入力を示すために使用できます。 sftpは、get、put、reget、rename、ln、rm、mkdir、chdir、ls、lchdir、chmod、chown、chgrp、lpwd、df、symlink、lmkdirのいずれかのコマンドが失敗すると中止されます。エラー終了は、「-」文字でコマンドを事前に修正することにより、コマンドごとに抑制できます(たとえば、-rm/tmp/blah *)。

4
heemayl

別のオプションは curl を使用することです:

curl -u user -T file.tar sftp://example.com/home/user/
2
Pere