リモートコンピュータ(制御できない)から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キー」とも呼ばれます)の代わりに。これは通常、このようなタスクが自動化される方法です。