[英]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.