如何sudo su;然后运行命令

时间:2019-08-16 15:12:59

标签: bash sudo pm2

任何人都可以帮助我解决以下问题

我需要通过例如SSH到另一台服务器ubuntu个有权运行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 个答案:

答案 0 :(得分:3)

除非您进行了不寻常的设置,否则通常无法将字符串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"

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

答案 1 :(得分:2)

使用-c的{​​{1}}选项来指定命令

来自su

  

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

man su

答案 2 :(得分:1)

您需要引用扩展名,以便在远程端解析整个字符串。

ssh -i somepemfile.pem ubuntu@1.1.1.1 "$CMD"

否则,扩展将进行分词,并且远程外壳程序将获得一个字符串,该字符串包含命令sudo和参数su;restart0;pm2restart;1;exit;。也就是说,ssh将根据您传递的单独参数构建单个字符串时将转义分号。

但是,这不能解决在pm2开始的shell中运行sudo的问题。 RamKrish2079解决了这个问题。

答案 3 :(得分:1)

su通常会将您置于一个子外壳中,您可以通过回显当前的PID(进程ID)来看到它

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

但是要解决这个问题,您可以像这样用管道输送要运行的命令

$ 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'