gpt4 book ai didi

python 子进程不适用于 ssh 命令

转载 作者:行者123 更新时间:2023-11-28 21:39:41 25 4
gpt4 key购买 nike

在我的桌面上,以下 shell 命令列出了远程服务器上根目录 /aa/*/bb/

ssh my_server 'echo /aa/*/bb/'

但是,当我从python子进程中调用它时,它报错

CalledProcessError: Command '['ssh', 'my_server', 'echo /aa/*/bb/']' returned non-zero exit status 255

代码在这里

subprocess.check_output(['ssh', 'my_server', 'echo /aa/*/bb/'], shell=True)

但是,如果我登录到远程服务器,然后运行

subprocess.check_output('echo /aa/*/bb/', shell=True)

有效。

我做错了什么?非常感谢您的帮助。

最佳答案

您的 shell=True 阻止传递参数。那是因为:

subprocess.check_output(['ssh', 'my_server', 'echo /*/'], shell=True)

...运行代码:

# /- from shell=True
# | ^ /- your first argument, becomes the script "sh -c" runs
# | | | /- your second argument, becomes $0 to that script
# | | | | /- your third argument, becomes $1 to that script
# | | | | |
sh -c ssh my_server 'echo /*/'

所以,您正在传递您的 shell 脚本(它只是确切的字符串 ssh)参数 $0 和 $1,但它根本不读取它们

如果您希望它与 shell=True 一起使用,您可以将其更改为:

#                        script      $0   $1           $2
subprocess.check_output(['ssh "$@"', '_', 'my_server', 'echo /*/'], shell=True)

但更好的办法是将这个论点排除在外:

subprocess.check_output(['ssh', 'my_server', 'echo /*/'])

关于python 子进程不适用于 ssh 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46451466/

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