繁体   English   中英

使用特殊字符在python中调用子进程

[英]Calling subprocess in python with special character

我有一个从密码管理器 API 获取密码的脚本,并使用此行创建 ssh 会话

subprocess.call(['sshpass', '-p', password, 'ssh', '-l', username, url])

但是我对此有一点问题,如果密码中有一些特殊字符,例如这个密码有问题

*jadKWI_3ekd}ad2+

如果我试图通过我的 python 脚本使用包含这些特殊字符的密码连接某个地方,我会从 ssh 收到错误消息:

Permission denied, please try again.

我已经在 shell 中尝试过这个命令,它可以正常工作

sshpass -p "*jadKWI_3ekd}ad2+" ssh url -l username

有人可以帮助我,如果有任何解决方案如何解决这个问题? 我发现有些人使用原始字符串解决了类似的问题,但这对我没有帮助。

ssh命令中的外壳特殊字符将由远程外壳评估,除非您引用或转义它们。

尝试这个:

import subprocess
import shlex

subprocess.check_call(
    ['sshpass', '-p', password,
     'ssh', '-l', username, 
             shlex.quote(password)])

除非您特别想忽略错误,否则通常更喜欢check_call而不是非常粗糙的call接口。

(也许还可以研究现代替代subprocess.run ,尽管 Python 2 中遗留的check_*函数对于它们的限制和缺乏灵活性不是问题的情况来说是方便的简写。)

无论如何,尚不清楚您为什么要尝试使用密码作为要连接的主机名; 可能这是一个XY 问题 但如果这真的是你想要的,这就是如何去做。

在某些情况下,您确实希望将带有 shell 元字符的字符串传递给远程ssh ,例如

matches = subprocess.run(
    ["ssh", "hostname",
     "grep", shlex.quote(".*"), "ick.txt"],
    check=True, text=True.
    capture_output=True)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM