如何使用sudo su并运行命令。

3

能否有人帮助我解决以下问题

我需要通过例如ubuntu用户使用ssh连接到另一台服务器,该用户具有运行sudo su的权限,并执行pm2 restart命令。

完整命令如下:

#!/bin/sh
CMD="sudo su; pm2 restart 0; pm2 restart 1; exit;"  
ssh -i somepemfile.pem ubuntu@1.1.1.1 $CMD

例如,我可以使用sudo正常运行任何命令。
CMD="sudo /etc/init.d/apache2 restart"  

但是使用sudo su命令时会出现卡顿且无响应的情况。

4个回答

4

除非您的设置不同寻常,否则通常不能像那样将su与其他前置命令串联起来。我想它正在运行sudo su,然后在根环境/会话中挂起,因为它在等待您退出,然后才继续执行pm2命令。相反,我建议使用-c选项,类似于以下内容:

CMD="sudo su -c 'pm2 restart 0; pm2 restart 1'"
ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"

如另一个回答所建议的那样,在ssh调用中将$CMD变量封装在引号中可能也会很有用。


3

通常情况下,su 命令会将您切换到一个子 Shell 中,您可以通过打印当前进程 ID(PID)来查看。

$ echo $$
94260
$ sudo echo $$
94260
$ sudo su
$ echo $$
94271

不过,要绕过这个问题,您可以像这样将要运行的命令管道传递给su

$ echo "whoami" | sudo su
root

而且我们运行多个命令

$ echo "uptime;whoami" | sudo su
11:29  up 8 days, 19:20, 4 users, load averages: 4.55 2.96 2.65
root

现在要使它与ssh一起工作

$ ssh wderezin@localhost 'echo "uptime;whoami" | sudo su'
sudo: no tty present and no askpass program specified

该命令需要为 su 命令分配一个 tty。在远程执行期间添加 -t 选项以分配一个 tty。
$ ssh -t wderezin@localhost 'echo "uptime;whoami" | sudo su'
11:36  up 8 days, 19:26, 5 users, load averages: 2.97 2.97 2.76
root

你的命令应该长成这样

ssh -i somepemfile.pem ubuntu@1.1.1.1 'echo "pm2 restart 0; pm2 restart1" | sudo su'


2

使用su命令的-c选项来指定命令。

来自man su

特别地,-c参数将导致大多数命令解释器将下一个参数视为命令。该命令将由目标用户在 /etc/passwd中指定的shell执行。

"-c"选项可用于指定要在以另一个用户身份登录后执行的命令。此选项后面紧跟着要执行的命令。请注意,这个命令将由目标用户在 /etc/passwd 中指定的shell执行。

CMD="sudo su -c  \"pm2 restart 0; pm2 restart 1;\""

1
您需要引用扩展名,以便在远程端解析整个字符串。
ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"

否则,扩展将受到单词分割的影响,远程shell获得一个字符串,其中包括命令sudo和参数su;restart0;pm2restart;1;exit;。也就是说,ssh在构建从传递的单独参数中生成单个字符串时会转义分号。

然而,这并不能解决通过sudo启动的shell中运行pm2的问题。这由ramki解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接