ssh経由でバッチモードでコマンドを実行するにはどうすればよいですか?つまり、ssh
コマンドに相当するものは何sftp -b <filename> <hostname>
ですか?
を介して接続している一連のホストで実行したい一連のコマンドがありますssh
。以上sftp
、コマンドをファイルに保存filename
してホストに接続し、前述のコマンドを使用してコマンドを実行します。
そのようなことは可能ssh
ですか?
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
。
man expect
?:\
しかし、それは完璧な方法ではありません。
expect
端末での実行を想定しているプログラムと対話するように設計されています。これは、sshでコマンドを実行する問題とは無関係です。
たぶん
ssh user@host sh -c "$(<filename)"
Arcegeによるスクリプトのもう1つのオプションは、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を引いた数)。