Python 如何将sshkey与子流程一起使用

Python 如何将sshkey与子流程一起使用,python,ssh,subprocess,public-key,Python,Ssh,Subprocess,Public Key,我正在尝试通过ssh连接到路由器,并将命令写入shell。 我认为连接可以工作,因为我得到的是一个空输出,而不是一条错误消息。我知道我必须使用密钥文件才能真正在设备上进行连接。也许这就是输出为空的原因 这是我的代码: mykey = os.path.expanduser('C:\\Users\\taaiaal1\\PycharmProjects\\hal_dmms_application\\dev_ssh') command = 'pcb_cli -u cwmpd pcb://ipc:[/var

我正在尝试通过ssh连接到路由器,并将命令写入shell。 我认为连接可以工作,因为我得到的是一个空输出,而不是一条错误消息。我知道我必须使用密钥文件才能真正在设备上进行连接。也许这就是输出为空的原因

这是我的代码:

mykey = os.path.expanduser('C:\\Users\\taaiaal1\\PycharmProjects\\hal_dmms_application\\dev_ssh')
command = 'pcb_cli -u cwmpd pcb://ipc:[/var/run/IGD] -i \'?\''

ssh = subprocess.Popen(["ssh", username + '@' + host + ':' + port, command],
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
print(result)
我应该在哪里集成密钥文件


我感觉像是检查了谷歌让我找到的每一个页面,甚至在子流程python文档中我也找不到任何东西。这可能吗?我正在使用Python 3

使用-i标志指定标识文件。见

在你的例子中,那就是

ssh = subprocess.Popen(["ssh","-i "+mykey, username + '@' + host + ':' + port, command],
                   shell=True,
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE)

Python还提供了高级SSH库。

使用-i标志指定标识文件。见

在你的例子中,那就是

ssh = subprocess.Popen(["ssh","-i "+mykey, username + '@' + host + ':' + port, command],
                   shell=True,
                   stdout=subprocess.PIPE,
                   stderr=subprocess.PIPE)
Python还提供了高级SSH库。

试试:

ssh = subprocess.Popen(["ssh", "-i", "/path/to/key", username + '@' + host + ':' + port, command],
                       shell=True,
                       stdout=subprocess.PIPE,
                       stderr=subprocess.PIPE)
Popen需要以某种方式格式化的参数数组。 获取正确的arg表的最简单方法是这样做:

command = "ssh -i my.key user@host"
args = command.split(' ')
ssh = subprocess.Popen(args)
尝试:

Popen需要以某种方式格式化的参数数组。 获取正确的arg表的最简单方法是这样做:

command = "ssh -i my.key user@host"
args = command.split(' ')
ssh = subprocess.Popen(args)
一些建议:

  • 首先,端口不是在
    之后给出的:
    ,它是通过
    -p
    选项给出的

  • 如果需要密钥,则必须使用
    -i
    选项指定它。确保密钥的权限为
    0400

  • 您以列表的形式给出远程命令,同时也给出
    shell=True
    这些选项在某种程度上是互斥的。如果希望使用shell=True,则可以将命令作为单个字符串发出

  • 如果要收集远程命令的输出,只需使用。它本质上使用popen()函数,但提供了更简单的接口。不要忘记try/except函数,因为如果ssh本身出现问题或远程命令的退出状态为非零,它会引发异常

您的代码可能如下所示:

try:
    out = subprocess.check_output(["ssh", "-i", "<path to your key>", "-p", "<port number>", "{}@{}".format(user, host), command])
    print(out)
except CalledProcessError as e:
    pass
试试看:
out=subprocess.check_输出([“ssh”、“-i”、“”、“-p”、“”、“{}@{}”。格式(用户、主机、命令])
打印(输出)
除被调用的进程错误为e外:
通过
如果您想了解执行远程命令的一些良好实践,请参阅我的远程命令执行指南

PS:使用子流程函数有两种不同的方式:一种是在远程命令有通配符(ls*.txt)或远程命令不需要shell执行eg
uname-a
时,需要shell来执行eg命令。请查看上面的子流程文档链接。

一些指针:

  • 首先,端口不是在
    之后给出的:
    ,它是通过
    -p
    选项给出的

  • 如果需要密钥,则必须使用
    -i
    选项指定它。确保密钥的权限为
    0400

  • 您以列表的形式给出远程命令,同时也给出
    shell=True
    这些选项在某种程度上是互斥的。如果希望使用shell=True,则可以将命令作为单个字符串发出

  • 如果要收集远程命令的输出,只需使用。它本质上使用popen()函数,但提供了更简单的接口。不要忘记try/except函数,因为如果ssh本身出现问题或远程命令的退出状态为非零,它会引发异常

您的代码可能如下所示:

try:
    out = subprocess.check_output(["ssh", "-i", "<path to your key>", "-p", "<port number>", "{}@{}".format(user, host), command])
    print(out)
except CalledProcessError as e:
    pass
试试看:
out=subprocess.check_输出([“ssh”、“-i”、“”、“-p”、“”、“{}@{}”。格式(用户、主机、命令])
打印(输出)
除被调用的进程错误为e外:
通过
如果您想了解执行远程命令的一些良好实践,请参阅我的远程命令执行指南


PS:使用子流程函数有两种不同的方式:一种是在远程命令有通配符(ls*.txt)或远程命令不需要shell执行eg
uname-a
时,需要shell来执行eg命令。请查看上面的子流程文档链接。

为什么不直接使用paramiko呢。为什么不干脆用paramiko来代替呢。是的,这很好。主机部分可以是ip地址或类似“myserver”的主机名。对于后一种情况,名称应位于/etc/hosts文件中或通过DNS识别。我在我的回答中编辑了这个例子。我添加了一个代理,它与你的建议一起工作。非常感谢。需要知道的重要一点是,输出以二进制流的形式出现。为了转换,我使用了
output.decode('utf-8')
Yes这很好。主机部分可以是ip地址或类似“myserver”的主机名。对于后一种情况,名称应位于/etc/hosts文件中或通过DNS识别。我在我的回答中编辑了这个例子。我添加了一个代理,它与你的建议一起工作。非常感谢。需要知道的重要一点是,输出以二进制流的形式出现。为了转换,我使用了
output.decode('utf-8')