我想知道是否有一种方法可以从本地计算机执行脚本/命令,而无需在远程计算机上以 root 身份进行任何修改?
一些背景
我正在尝试通过 Capistrano 设置一些任务,并且我需要sudo
访问权限。大约有30多台服务器,对我来说手动更新/etc/sudoers
会很痛苦,所以我想知道是否有一种方法可以远程更新这个文件?
答案1
bash
您可以通过在远程系统上执行并向其提供脚本来远程运行本地脚本
$ ssh user@host 'bash -s' < script.sh
编辑
要执行需要sudo
在远程计算机上使用的命令,请使用ssh's
-t
选项并将命令传递给ssh
.该-t
选项分配一个伪终端并允许用户与 运行的命令进行交互ssh
,例如输入密码sudo
$ ssh user@host -t 'sudo foo'
sed
建议使用此方法而不是重定向来修改文件,>
因为 shell 重定向不允许在使用sudo
.此外,命令中的所有变量sed
在传递给ssh
.
$ ssh user@host -t 'sudo sed -i "\$a text to insert" /path/to/file'
要使整个过程自动化:
#!/bin/bash
SERVERS=( server1 server2 server3 )
for HOST in ${SERVERS[@]}; do
ssh user@${HOST} -t 'sudo sed -i "\$a text to insert" /path/to/file'
if [[ $? -ne 0 ]]; then
echo "ERROR: $HOST did not complete"
else
echo "$HOST complete"
fi
done
答案2
我发现该tee
命令有助于避免文件重定向的 sudo 限制。由于字符转义要求,使用 sed 被证明是令人沮丧的。
这是我用来将集群中所有计算机的主机远程附加到 /etc/hosts 的命令:
for i in {1..10}; do ssh [email protected].$i -t "echo '10.1.1.1 dev-1
10.1.1.4 dev-4
10.1.1.3 dev-3
10.1.1.2 dev-2
10.1.1.6 dev-6
10.1.1.8 dev-8
10.1.1.5 dev-5
10.1.1.10 dev-10
10.1.1.9 dev-9
10.1.1.7 dev-7' | sudo tee -a /etc/hosts >/dev/null"
每次迭代的输出如下所示:
0+1 records in
0+1 records out
255 bytes (255 B) copied, 4.1338e-05 s, 6.2 MB/s
SU 的这个答案对于构建我的最终解决方案至关重要:https://superuser.com/a/1026359/587485
答案3
如果您需要运行多个命令或重定向,您应该使用以下语法:
ssh server.com "sudo sh -c 'ps aux | grep jav > /root/1.txt'"
答案4
在尝试修改 sudoers 文件之前,您必须已经具有某种根级别的访问权限,可以通过直接根密码或您的用户 ID sudo 规则设置。