我今天很难处理ssh和bash。我需要运行一个脚本,该脚本的参数是本地文件,通过ssh连接运行。这是处理ssh连接的脚本:
#!/bin/bash
if [ $# -ne 3 ]
then
echo "Incorrect number of parameters"
exit
fi
cat "$3" | while read line;
do
ssh -o ConnectTimeout=5 -i ./private_key as@$line < ./mod_users.sh "$1" "$2"
if [ $? -ne 0 ]
then
echo "$line is not accesible"
fi
done
&#34; $ 2&#34;参数是我正在执行ssh的机器中的本地文件。脚本&#34; mod_users.sh&#34;添加或删除它从&#34; $ 2&#34;。
中读取的一堆用户我要做的是执行脚本&#34; mod_users.sh&#34;通过ssh,从网络连接的机器批量添加或删除用户。另外,正如您所看到的,我要连接的所有机器都有我的公钥,所以我通过私钥/公钥对连接,以便远程机器不要求密码。
希望有足够的信息。如果你需要任何额外的,只要求它,我很乐意回答。
编辑:另外,是否可以在远程计算机上使用sudo运行脚本?
答案 0 :(得分:0)
据我所知,mod_users.sh和arg $ 1是本地文件,mod_users.sh为远程机器生成命令。
您应该执行以下操作:
./mod_users.sh "$1" "$2" | ssh -o ConnectTimeout=5 -i ./private_key as@$line bash
你也可以添加sudo:
./mod_users.sh "$1" "$2" | ssh -o ConnectTimeout=5 -i ./private_key as@$line "sudo bash"
如果您想要更安全并且对特定命令赋予sudo权限,请尝试以下操作:
./mod_users.sh "$1" "$2" | sed 's/^/sudo /'| ssh -o ConnectTimeout=5 -i ./private_key as@$line bash
它将在mod_users.sh生成的任何行之前插入sudo。但可能最好的方法是修补mod_users.sh。
答案 1 :(得分:0)
如果您更改mod_users.sh
以接受$2
中文件的文字,而不是文件的名称,并且远程用户的shell是bash(不是/bin/sh
),你可以这样做:
ssh_args=( -o ConnectTimeout=5 -i ./private_key )
while IFS= read -r line <&3; do
printf -v args_q '%q ' "$1" "$(<"$2")"
if ! ssh "${ssh_args[@]}" "as@$line" "bash -s $args_q" <mod_users.sh; then
echo "Operation failed for $line" >&2
fi
done 3<"$3"
如果您不愿意对磁盘上的文件进行更改,可以在管道中修补相应的前缀:
script_prefix='
tempfile=$(mktemp -t input.XXXXXX) || exit
trap '$'\'rm -f "$tempfile"\''' EXIT
printf "%s\n" "$2" >"$tempfile" || exit
set -- "$1" "$tempfile"
'
ssh_args=( -o ConnectTimeout=5 -i ./private_key )
while IFS= read -r line <&3; do
printf -v args_q '%q ' "$1" "$(<"$2")"
if ! ssh "${ssh_args[@]}" "as@$line" "bash -s $args_q" \
< <(printf '%s\n' "$script_prefix"; cat mod_users.sh); then
echo "Operation failed for $line" >&2
fi
done 3<"$3"