[求助] 用 paramiko 执行命令碰到的 Linux shell 环境问题

2019-04-30 11:53:02 +08:00
 DaWNY

具体的问题如下图所示

前置条件:deployer 账号不能执行 sudo su- 切换为 root 用户,只能执行 sudo su 暂时获得 root 权限。

图一为手动在机器上执行巡检命令 先 sudo su 然后 supervisorctl status 正常返回结果。

用图二脚本中的语句 paramiko.SSHClient().exec_command('sudo su;supervisorctl status',get_pty=True) 执行,python 进程一直处于运行状态 但无返回结果。

命令行单独运行以下语句 也是同样的结果: python -c 'import paramiko;ssh=paramiko.SSHClient();ssh.load_system_host_keys();ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy());ssh.connect("xxx",22,"deployer","xxx",compress=True);stdin,stdout,stderr = ssh.exec_command("sudo su;supervisorctl status");print stdout.read()'

怀疑是 sudo su 切换后环境变量仍然是 deployer ? 所以执行不成功??

求大佬指点

4813 次点击
所在节点    Linux
16 条回复
defunct9
2019-04-30 12:41:19 +08:00
弄出 ssh.exec_command 的代码看看
omph
2019-04-30 12:48:57 +08:00
[提升 python 脚本到 root 权限执行]( https://www.oschina.net/code/snippet_23734_23431)
Aug
2019-04-30 13:06:19 +08:00
sudo -i,加载用户变量,并跳转到目标用户 home 目录
sudo -s,不加载用户变量,不跳转目录
DaWNY
2019-04-30 14:14:44 +08:00
@Aug 额== deployer 账号不能执行 sudo su- 切换为 root 用户,只能执行 sudo su 暂时获得 root 权限
DaWNY
2019-04-30 14:33:28 +08:00
SleipniR
2019-04-30 14:59:38 +08:00
试试这个,不确定行不行:
sudo su -l root -c "supervisorctl status"
DaWNY
2019-04-30 15:17:45 +08:00
@SleipniR 完美解决-- 我就是不知道怎么把两条命令并为一行!!
SleipniR
2019-04-30 16:16:05 +08:00
引号里面用分号隔开多条命令?
hasdream
2019-04-30 16:56:43 +08:00
sudo supervisorctl status 或者 sudo su - root sh -c 'supervisorctl status'
firejoke
2019-04-30 17:50:33 +08:00
@DaWNY 两条 shell 命令可以用 && 连接
你用 ssh 的话, 可以用 Fabric 库, 对 paramiko 和 invoke 的封装, 还可以用 Responder 对象做交互式响应,
只是别看 Fabric1 的文档, 看 Fabric2 的, 改动有点大
DaWNY
2019-04-30 18:38:45 +08:00
@SleipniR 我就是用分号隔开 sudo su;supervisorctl status,不行,估计环境变量没跟进去-
DaWNY
2019-04-30 18:39:59 +08:00
@firejoke 可以试试
DaWNY
2019-04-30 18:40:22 +08:00
@hasdream 后面应该可以-
crazypig14
2019-05-01 06:59:32 +08:00
linux 文档很方便

$ su -h

用法:
su [选项] [-] [USER [参数]...]

将有效用户 id 和组 id 更改为 USER 的 id。
单个 - 视为 -l。如果未指定 USER,将假定为 root。

选项:
......
-, -l, --login 使 shell 成为登录 shell
-c, --command <命令> 使用 -c 向 shell 传递一条命令
--session-command <命令> 使用 -c 向 shell 传递一条命令
而不创建新会话
......
-V, --version 输出版本信息并退出
ps1aniuge
2019-05-01 14:11:20 +08:00
我来教楼主 2 招:
1 用 ssh+密钥+从远程 root 连接,即可绕过 用户,sudo 这种问题。
2 用 powershell 远程连接。即可比 python 简单。

对比:
$连接 1 = New-PSSession -HostName 1.1.1.1 -UserName root -KeyFilePath /tmp/a.b
invoke-command -ScriptBlock { supervisorctl status } -Session $连接 1


import paramiko;
ssh=paramiko.SSHClient();
ssh.load_system_host_keys();
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy());
ssh.connect("xxx",22,"deployer","xxx",compress=True);
stdin,stdout,stderr = ssh.exec_command("supervisorctl status");
print stdout.read()
DaWNY
2019-05-01 20:20:28 +08:00
@ps1aniuge 主要我没 root 有 root 我肯定用 root--

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/560053

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX