Ssh経由でバッチモードでコマンドを実行するにはどうすればよいですか?つまり、ssh
コマンドのsftp -b <filename> <hostname>
に相当するものは何ですか?
ssh
を介して接続している一連のホストで実行したい一連のコマンドがあります。 sftp
を介して、コマンドをファイルfilename
に保存し、ホストに接続して、前述のコマンドを使用してコマンドを実行します。
ssh
を介してそのようなことは可能ですか?
私が間違っている場合は修正してください。ただし、スクリプトがローカルにあるリモートサーバーで通常のシェルコマンドを実行したいようです。
#!/bin/sh
trap "rm -f /tmp/sendonssh.$$.*" 0 1 2 3 15
# commands to run on the remote server
cat <<'EOF' >> /tmp/sendonssh.$$.sh
mkdir -p /tmp/foobar.$$
mv $HOME/xyzzy /tmp/foobar.$$
chmod 640 $HOME/xyzzy
EOF
# call for each argument
for userhost in "$@"; do
errorout=`ssh -aTxo BatchMode=yes $userhost /bin/sh -s < /tmp/sendonssh.$$.sh 2>&1`
rc=$?
if [ $rc -ne 0 ]; then
echo "Error: $userhost: $errorout"
exit $rc
fi
done
シェルの代わりにPythonを使用して、テスト環境のいくつかの「リモート実行」アプリでこれを行います:ssh $userhost python < $pythonscriptfilename
。
sftp -b <filename> <hostname>
に相当するSSHは次のようになります。
ssh -o BatchMode=yes <hostname> sh -s < "<filename>"
それを簡単に保ち、他のコンピュータで「バッチ」ファイルを実行するのはどうですか?
バッチファイルは通常のシェルスクリプトなので、構文はよく知られています。
Arcegeによるスクリプト の別のオプションは、Bash関数です。
_sshbatch() {
# Expect at least 2 parameters, if less are provided print help
if [[ ${#@} -lt 2 ]]; then
printf 'Usage: sshbatch [user@]Host... input_file\n'
else
while read -r -u "$fd" Host; do
# Check if the last parameter is a readable file, else print error and exit
[[ -r ${@:(-1)} ]] || { printf "The file ${@:(-1)} is not readable!\n"; break; }
# Run remote bash from the file given in the last parameter
ssh -o BatchMode=yes "$Host" bash -s < "${@:(-1)}"
# Read Host list from 1st to next to last parameters
done {fd}< <(printf '%s\n' "${@:1:${#@}-1}")
fi
}
_
Sshの_-T
_オプションは、すべてのケースで機能するわけではないため、使用しません。
このスクリプトは、位置パラメーター配列_$@
_でパラメーター拡張を使用します。
"${@:(-1)}"
は、最後のパラメーターに展開します(文字通り、最初から最後まで)"${#@}"
_は定位置パラメーターの数に展開されます"${@:1:${#@}-1}"
_は、最初から最後から最後まですべてのパラメーターのリストに展開します(文字通りパラメーターの数から1を引いた数)。man expect
? :\
しかし、それは完璧な方法ではありません。
たぶん
ssh user@Host sh -c "$(<filename)"
Sshの強制コマンドを使用できます。
これらは特定のキーに関連付けられています。そのキーで認証が完了すると、そのコマンドが実行され、接続が終了します。この場合、キーを使用してログインシェルにアクセスできないため、このアプローチの利点の1つはセキュリティの向上です。