如何以 root 身份在远程服务器上执行更改?

如何以 root 身份在远程服务器上执行更改?

我想知道是否有一种方法可以从本地计算机执行脚本/命令,而无需在远程计算机上以 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 规则设置。

相关内容