Python 如何将sshkey与子流程一起使用
我正在尝试通过ssh连接到路由器,并将命令写入shell。 我认为连接可以工作,因为我得到的是一个空输出,而不是一条错误消息。我知道我必须使用密钥文件才能真正在设备上进行连接。也许这就是输出为空的原因 这是我的代码: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
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执行eguname-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')