繁体   English   中英

如何 sudo su; 然后运行命令

[英]How to sudo su; then run command

谁能帮我解决以下问题

我需要通过例如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案例它以某种方式挂起并且不响应

除非您有一个不寻常的设置,否则您通常不能将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调用中的引号中也可能很有用。

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

来自man su

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

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

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

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

否则,扩展会受到分词,远程 shell 会得到一个由命令sudo和参数su;组成的字符串su; , restart , 0; , pm2 , restart; , 1; ,然后exit; . 也就是说,当ssh根据您传递的单独参数构建单个字符串时,它会转义分号。

但是,这并不能解决在sudo启动的 shell 中运行pm2的问题。 这由ramki解决。

su 通常会将您置于子 shell 中,您可以通过回显当前 PID(进程 ID)来查看该子 shell

$ 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。 添加在远程执行期间分配 TTY 的 -t 选项。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM