处理sshpass密码字段中的特殊字符

时间:2014-09-29 15:32:46

标签: python bash ssh sshpass

我有一个Python脚本,它使用sshpass来对机器进行ssh访问

Popen(["sshpass","-p", "test!@#", "ssh", "-o UserKnownHostsFile=/dev/null", "-o StrictHostKeyChecking=no", "user1@192.168.10.1"])

但由于密码字段中存在特殊字符,此命令会引发一些错误。有没有办法可以在sshpass中使用带有特殊字符的密码或其他可以从Python调用的东西?

错误是:bash: !@#": event not found

3 个答案:

答案 0 :(得分:2)

逃脱角色在我的案例中起作用。只需在'!'之前使用\字符或其他特殊字符。

答案 1 :(得分:0)

Python不喜欢特殊字符。通过尾随\转义符号或使用r"test!@#"中的原始字符串。

答案 2 :(得分:0)

首先,将sshpass-p选项一起使用意味着您将密码发布给同一台计算机上的任何人。这就像把你的房子钥匙放在你的地毯下。

错误消息来自用于执行上述命令的shell(可能是BASH)。字符!被解释为特殊字符,意味着“查看我之后的文本的历史记录”。

问题很可能出现在sshpass脚本中(因为您未在shell=True中指定Popen())。您可以尝试通过确保使用正确的引用和转义来修复脚本。

另一种解决方案是将env={'SSHPASS': 'test!@#'}传递给Popen(),将sshpass的环境设置为explained in the manpage

cmd = ['sshpass', '-e', 'ssh', '-o', 'UserKnownHostsFile=/dev/null', ...]
env = os.environ.copy()
env['SSHPASS'] = 'test!@#'
Popen(cmd, env=end)

注意:您应该将"-o key=value"拆分为"-o", "key=value"

相关: