【问题标题】:How to get bash output over ssh via Paramiko如何通过 Paramiko 通过 ssh 获取 bash 输出
【发布时间】:2014-08-19 05:01:21
【问题描述】:

我正在尝试在通过 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 通道接收时出现超时异常。

【问题讨论】:

    标签: python bash ssh paramiko


    【解决方案1】:

    发送路径和/或运行小脚本时要小心——很容易不正确地引用内容。这将显示为程序大部分时间运行正确,但无法处理带有空格、撇号或 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
    

    【讨论】: