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


13

これは非常に基本的な質問であり、bashの初心者であり、これを行う方法がわかりませんでした。グーグルは残念ながら私をどこにも連れて行ってくれませんでした。

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

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

UpdateJar.sh

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/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:command not foundと表示されます。

これを適切に機能させるにはどうすればよいですか?

ありがとう


回答:


15

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

#!/bin/bash

sftp -oPort=23 kalenpw@184.155.136.254:/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)名前が行の先頭に発見されるまで、(それ自体で)次の行を渡すようにスクリプトに指示します。


それはまさに私が必要としていたものでした。ここのドキュメントを読み上げる必要があります。簡単な回答をありがとう、私は8分でそれを受け入れます。
kalenpw

問題ありません(重複を探しましたが、「不明」として閉じられているのは1つだけでした)。
トーマスディッキー

サーバーがシェルスクリプトのコメントを妨げないことを確認しますか?
-alk

また、このアプローチはシェルの種類に依存します。
-alk

@alkスクリプトはコメントの有無にかかわらず動作します
-kalenpw

5

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

scp -P 23 /home/kalenpw/.m2/repository/com/Khalidor/TestPlugin/0.0.1-SNAPSHOT/TestPlugin-0.0.1-SNAPSHOT.jar kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins

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

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


事前にscpを知らなかったのは非常に便利です。そして、あなたは正しかっscpた私のマシンですでに利用可能です
-kalenpw

4

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

たとえば、すべてのコマンドをfileに入れることができます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 kalenpw@184.155.136.254:/home/kalenpw/TestWorld/plugins 

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

からman sftp

-bバッチファイル

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


2

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

curl -u user -T file.tar sftp://example.com/home/user/
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.