如何通过Paramiko在ssh上获得bash输出

时间:2014-08-18 19:59:26

标签: python bash ssh paramiko

我尝试在通过ssh执行其他命令之前测试用户的文件权限。我有:

ssh = paramiko.SSHClient()
channel = ssh.get_transport().open_session()

# Check permissions
channel.send("if [ -w %s ]; then echo \"true\"; else echo \"false\"; fi\n" % self.dest_path)
    if (channel.recv(1024) == "false"):
        exit(PRIV_ERR)

但是,我从来没有得到远程机器的响应。其他.recv()来电可以很好地响应,所以我认为我的bash脚本存在问题?它在当地工作正常。当我尝试通过ssh频道接收时,我收到超时异常。

1 个答案:

答案 0 :(得分:0)

小心发送路径和/或运行小脚本 - 很容易不正确引用内容。这将显示为程序在大多数情况下正确运行,但无法处理带有空格或撇号或Unicode字符的文件。

此代码运行" test -f(mypath)"远程,发信号通知mypath是否为文件。考虑使用像Fabric这样的更复杂的库来做这种事情 - 它更可靠。 (Fabric链接)

import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('localhost')

# Check permissions
# TODO: do proper quoting to handle filenames with apostrophes
_stdin,stdout,_stderr = client.exec_command(
    "test -f '{}' && echo isfile".format('/etc/issue')
)
isfile = stdout.read().strip() == 'isfile'
print 'isfile:', isfile

输出

isfile: True