ai didi

python - "ssh sudo -u user -i"的 subprocess.Popen 失败,错误代码为 "sudo: sorry, you must have a tty to run sudo"

转载 作者:行者123 更新时间:2023-12-02 22:29:58 24 4
gpt4 key购买 nike

我想通过 ssh 连接到远程服务器,更改用户然后执行脚本。我正在使用 subprocess 来执行此操作,但似乎 sudo -u userB -i 并未更改用户。

HOST = 'remote_server'
USER = 'userA'
CMD = ' whoami; sudo -u userB -i; whoami'

ssh = subprocess.Popen(['ssh', '{}@{}'.format(USER, HOST),CMD],
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if not result:
err = ssh.stderr.readlines()
print('ERROR: {}'.format(err))
else:
print "success"
print(result)

$ success
$ ['userA\n', 'userA\n']

当我替换为 CMD ='sudo -u userB -i && whoami' 时,出现此错误:

ERROR: ['sudo: sorry, you must have a tty to run sudo\n']

在终端上,我可以执行无密码 ssh,sudo -u userB -i && whoami

最佳答案

目标系统上的

sudo 配置为需要 terminal emulation 。这样做通常是为了实际上防止您尝试实现的那种自动化。在尝试绕过该限制之前,请先咨询您的服务器管理员。要么不需要限制,那么管理员可以为您关闭它。或者限制是有原因的,管理员不会高兴您试图绕过它。

可以通过从 sudoers file 中删除 requiretty 选项来关闭该限制。 (该选项默认关闭)。

<小时/>

要使 ssh 使用终端模拟来执行其命令行上提供的命令,您需要使用 -t switch 。但要使 -t 真正产生任何效果,您需要首先从终端运行 ssh 。由于 subprocess.Popen 不是终端,您将得到:

Pseudo-terminal will not be allocated because stdin is not a terminal

要绕过这个问题,您必须使用两个 -t 开关:-tt

关于python - "ssh sudo -u user -i"的 subprocess.Popen 失败,错误代码为 "sudo: sorry, you must have a tty to run sudo",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48595481/

24 4 0
文章推荐: powershell - 如何编写中间带有参数的 PowerShell 别名?
文章推荐: Sharepoint 计算字段函数引用
文章推荐: debugging - 观察 Linux 内核中的变量(内存地址)变化,并在变化时打印堆栈跟踪?
文章推荐: javascript - Push 正在覆盖数组中以前的数据
行者123
个人简介

我是一名优秀的程序员,十分优秀!

滴滴打车优惠券免费领取
滴滴打车优惠券
全站热门文章
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com