Arc*_*ger 3 python ssh sudo tty
我想通过 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']
Run Code Online (Sandbox Code Playgroud)
当我替换为 时CMD ='sudo -u userB -i && whoami',出现此错误:
错误:['sudo:抱歉,你必须有一个 tty 才能运行 sudo\n']
在终端上,我可以进行无密码 ssh, sudo -u userB -i && whoami
sudo在目标系统上配置为需要终端仿真。这样做通常是为了防止您尝试实施的那种自动化。在尝试绕过该限制之前,请咨询您的服务器管理员。要么不需要限制,然后管理员可以为您关闭它。或者限制是有原因的,管理员不会因为您试图绕过它而感到高兴。
可以通过requiretty从sudoers文件中删除选项来关闭限制(默认情况下该选项是关闭的)。
要ssh对其命令行上提供的命令使用终端仿真,您需要使用-tswitch。但是-t要真正产生任何效果,您首先需要ssh从终端运行。由于subprocess.Popen不是终端,您将获得:
不会分配伪终端,因为 stdin 不是终端
要绕过它,您必须使用双-t开关:-tt。