【发布时间】:2018-05-07 20:16:46
【问题描述】:
我今天很难处理 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
“$2”参数是我正在执行 ssh 的机器中的本地文件。脚本“mod_users.sh”添加或删除了从“$2”读取的一组用户。
我要做的是通过 ssh 执行脚本“mod_users.sh”,并从联网的机器上批量添加或删除用户。此外,如您所见,我将连接的所有机器都包含我的公钥,因此我通过私钥/公钥对进行连接,这样远程机器就不会要求输入密码。
希望这是足够的信息。如果您需要任何额外的东西,请提出要求,我很乐意回答。
编辑:另外,是否可以在远程机器上使用 sudo 运行脚本?
【问题讨论】:
-
ssh ... ./private_key as@$line < ./mod_users.sh "$1" "$2"与ssh ... ./private_key as@$line "$1" "$2" <mod_users.sh完全相同,除了仅限于 bash(POSIX 仅要求 shell 在行尾支持重定向)。这真的是您想要的吗(将mod_users脚本的文本作为 SSH 进程的输入提供?) -
是的,这正是我想要的,提供文本并在远程机器上执行它,但使用本地文件来获取信息
-
为什么您的
mod_users.sh需要远程运行?如果您修改它以执行 Sasha 假设您首先想要的操作(使用本地文件生成远程命令,而不是在本地运行命令),这对您的用例有用吗?请注意,在 bash 中安全地生成远程命令需要一些注意——甚至不要echo "useradd $username";相反,printf 'useradd %q\n' "$username"以确保安全地转义替换的值。 -
谢谢,我试试