gpt4 book ai didi

python - 运行 Python 脚本后终端搞砸了(不显示新行)

转载 作者:太空狗 更新时间:2023-10-29 21:37:08 26 4
gpt4 key购买 nike

我有一个 Python 脚本,用于使用 Python 子进程模块跨多个主机并行执行命令。它包装了 SSH,基本上是这样调用的:

output = subprocess.Popen(["/bin/env", env, "/usr/bin/ssh", "-t", "%s@%s" % (user, host), "--", command], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()

有效的命令是这样执行的:

/bin/env TERM=$TERM:password /usr/bin/ssh -t "%s@%s" % (user, host), "--", command

它工作正常,除了我在运行脚本后我的终端变得困惑(丢失换行符)的间歇性错误。命令行中的“重置”修复了它,但我不确定这是怎么发生的。我注意到有时在元组输出的第一项末尾有一个 "\r\n" ,有时它不存在。请参阅以下内容,特别是“Permission denied\r\n”:

**** Okay output ****
[user@/home/user]# ./command.py hosts.lists "grep root /etc/shadow"
Running command "grep root /etc/shadow" on hosts in file "hosts.test"
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server1.example.com closed.\r\n')
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server2.example.com closed.\r\n')
[user@/home/user]#


**** Output causes terminal to not display newlines ****
[user@/home/user]# ./command.py hosts.list "grep root /etc/shadow"
('grep: /etc/shadow: Permission denied\r\n', 'Connection to server1.example.com closed.\r\n')
('grep: /etc/shadow: Permission denied\n', 'Connection to server2.example.com closed.\r\n')
[user@/home/user]# [user@/home/user]# [user@/home/user]

第二个输出略有修改,但显示了缺少的 “\r”,以及运行脚本后我的提示如何变得“异常”。

我认为这与在我的子进程命令中使用“-t”选项有关。不知何故,我失去了\r。如果我删除“-t”选项,这个问题就消失了,但长话短说,我需要它来传递环境变量以在远程机器上使用(我使用 TERM 变量来传递用户密码sudo 目的,因为我不能假设 AcceptEnv 允许在远程 sshd 服务器上传递任意变量;我这样做是为了避免在命令行上传递密码,这将显示在远程机器的进程列表中)。

只是想知道是否有人知道如何在不删除“-t”选项的情况下解决这个问题?

更新:在我的脚本中运行 subprocess.Popen(...).communicate() 命令后,我的 tty 设置似乎发生了变化,无论我是否实际将输出打印到屏幕上。我觉得这很奇怪。以下是我的 tty 配置的前后差异(来自 stty -a):

-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff
-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff


opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0

isig icanon -iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt

我想知道如何阻止 communicate() 更改我的终端设置?这可能吗,或者这是一个错误?

最佳答案

我发现

stty sane

将控制台恢复到之前的状态。我真的不明白这里的其他答案,所以我这对某人有帮助。

找到答案 here .

关于python - 运行 Python 脚本后终端搞砸了(不显示新行),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26413847/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com