bash - 如何 sudo su; 然后运行命令
问题描述
谁能帮我解决以下问题
我需要通过例如ubuntu
有权运行 sudo su 的用户ssh 到另一台服务器,然后执行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 通常会将您置于子 shell 中,您可以通过回显当前 PID(进程 ID)来查看
$ 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'
推荐阅读
- ios - 如何使用 Xcode 9.3 在 iOS 开发设备中检查 [NSUserDefaults standardUserDefaults]
- r - as.POSIXct 的时区不起作用
- python - Pandas:如何将行附加到按日期索引的现有数据框?
- c - 在 C 中保存 PGM 图像
- mysql - 如何将Powershell中SQL存储过程返回的消息返回到记事本
- javascript - 使用 sql 值的完整日历
- javascript - React Native socketio 无法连接到 nodejs 服务器(浏览器可以访问服务器)
- node.js - 节点,生成多个依赖的 shell 命令
- javascript - 两行中的 headerText - JS - Oracle Jet
- keyword - 在 gensim + 关键字提取中使用 pos_tagger 选项的正确方法