異なるスイッチを使用した複数のSSHコマンドの実行

異なるスイッチを使用した複数のSSHコマンドの実行

リモートコンピュータ(制御できない)から2つのファイルをコピーしてアクセスする必要があるパスに保存するbashスクリプトがありますroot。ここにいる:

ssh administrator@host "mkdir ${DIR}"
ssh -t administrator@host "sudo su - root -c 'cp /path/for-root-only/data1/${FILENAME} ${DIR}/'"
ssh administrator@host "mv ${DIR}/${FILENAME} ${DIR}/data1-${FILENAME}"
ssh -t administrator@host "sudo su - root -c 'cp /path/for-root-only/data2/${FILENAME} ${DIR}/'"
scp administrator@host:$DIR/{${FILENAME},data1-${FILENAME}} .
ssh administrator@host "rm -r ${DIR}"

スクリプトは、同じパスワードを複数回要求するメッセージを表示します。次のようにドキュメントを介してすべてのコマンドをマージしてみましたssh -t

ssh -t administrator@host << EOF
    mkdir ${DIR}
    sudo su - root -c 'cp /path/for-root-only/data1/${FILENAME} ${DIR}/'
    mv ${DIR}/${FILENAME} ${DIR}/data1-${FILENAME}
    sudo su - root -c 'cp /path/for-root-only/data2/${FILENAME} ${DIR}/'
EOF
scp administrator@host:$DIR/{${FILENAME},data1-${FILENAME}} .
ssh administrator@host "rm -r ${DIR}"

しかし、このような警告があります。

stdin が端末ではないため、疑似端末は割り当てられません。

パスワードプロンプトの数を最小限に抑えるために、このスクリプトを書く正しい方法があるかどうかを尋ねたいと思います。

答え1

SSH接続を開いて使用します。 OpenSSHのこの機能はマスター接続と呼ばれます。バラより設定された SSH チャネルの使用

ssh_control_socket="$(mktemp)"
ssh -o ControlPath="$(ssh_control_socket)" -o ControlMaster=yes -o ControlPersist=yes administrator@host "mkdir ${DIR}"
# other commands using ssh (ssh, scp, rsync, …): pass the same ControlPath option
ssh -o ControlPath="$(ssh_control_socket)" -t administrator@host "…"
rsync -e "ssh -o 'ControlPath=$(ssh_control_socket)'" …
ssh -o ControlPath="$(ssh_control_socket)" administrator@host -O exit
rm -f "$(ssh_control_socket)"

面倒なことに、各SSH呼び出しに対してオプションを明示的に渡す必要があります(ControlPath各呼び出しと実際の接続を作成する元のSSHクライアント間の通信に使用されるファイル名)。sshここでは、スクリプトがそれ自体を含むように明示的なソケット名を渡します。依存関係が~/.ssh/config許可されている場合は、次の行を次の行に追加してください~/.ssh/config

ControlPath ~/.ssh/%l_%h_%p_%r.multiplex

これにより、各SSHクライアントは既存の接続があるかどうかを確認できます。この関数は、リッスンするデフォルトの接続がないと実際には使用されません。最初の接続では、まだ転送-o ControlMaster=yes(または-M単純に)する必要があります。つまり、スクリプトは次のようになります。

# Open the shared connection
ssh -M -o ControlPersist=yes administrator@host :
# … all SSH-relying commands in their basic form, they will go via the shared connection …
# Close the shared connection
ssh -O exit administrator@host

答え2

あなたはこれを行う必要はありませんここ文書化(<<この内容の目的はまさにこれです)。

あなたは簡単にすることができますssh remotehost "command1; command2 ; command3"

例えば

% ssh localhost "date ; uptime ; echo hello"
sweh@localhost's password: 
Tue Jul 19 08:07:48 EDT 2016
 08:07:48 up 15 days, 31 min,  3 users,  load average: 0.33, 0.33, 0.40
hello

ただし、scpこの方法では簡単にマージされません。

だから、使用を検討したいかもしれません公開鍵認証パスワード認証(「sshキー」とも呼ばれます)の代わりに。これは通常、このようなタスクが自動化される方法です。

関連情報