Answers:
如果我错了,请纠正我,但是您似乎想在脚本位于本地的远程服务器上运行常规的shell命令。
#!/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(而不是shell)使用一些“远程执行”应用程序来执行此操作ssh $userhost python < $pythonscriptfilename
。
man expect
?:\
但这不是完美的方法。
expect
旨在与希望在终端上运行的程序进行交互。这与通过ssh运行命令的问题无关。
您可以使用ssh强制命令。
这些与特定的密钥相关联。使用该密钥完成身份验证后,将运行该命令并退出连接。这种方法的一个优点是提高了安全性,因为在这种情况下,密钥不能用于访问登录外壳。
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}"
扩展到所有参数的列表,从第一个到最后一个(从字面上看,参数数量减去一个)。