如何使用 Python 的 subprocess 模块调用系统命令 scp?

2020-10-23 13:37:11 +08:00
 smallpython
在使用 scp 命令的时候, 需要在信任对方主机的时候输入 yes, 且之后还要输入密码

请问 python 能够模拟键盘输入这两个信息吗?

比如需求是把 a.txt 复制到 100 台服务器上, 能够做成自动化的脚本吗? 程序自己输入 yes 及密码
1866 次点击
所在节点    Python
14 条回复
gnozix
2020-10-23 13:42:46 +08:00
感觉你需要的是 ansible
zydxn
2020-10-23 13:44:43 +08:00
之前用 paramiko 做过类似的事情

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname, ssh_port, username=username, password=password)
transport = client.get_transport()
sftpClient = paramiko.SFTPClient.from_transport(transport)
# 传输
sftpClient.put(localpath, remotepath, callback=your_call_back)
client.close()
MoYi123
2020-10-23 13:46:00 +08:00
用 expect 就行了

#!/usr/bin/expect
spawn ssh root@{host} -p {port}
expect "{host}'s password: "
send "{password}"
interact

这是 ssh 的例子
huangmingyou
2020-10-23 13:46:04 +08:00
ssh 有参数忽略主机 key 认证,另外用密钥文件替代口令。
wwqgtxx
2020-10-23 13:47:46 +08:00
是可以的,不过你需要用 subprocess.Popen 去完成交互
smallpython
2020-10-23 13:49:21 +08:00
@MoYi123
@huangmingyou
我想问的是有没有什么方法可以让程序自己输入, 而不是绕开输入, 因为如果绕开的话, 虽然功能解决了, 但是还是不知道怎么让 Python 自己去填写这个信息
smallpython
2020-10-23 13:53:41 +08:00
@wwqgtxx 能给个具体例子吗?我自己测试 stdin.write()方法只有在本地命令才会生效, 涉及到这种两台机器交互的情况就没用了, 还是会让我手动输入密码
tony9413
2020-10-23 13:56:05 +08:00
paramiko 正解,如果不会,可以试试 robot 封装的[SSHLibrary]( http://robotframework.org/SSHLibrary/)
bairdshi
2020-10-23 15:26:16 +08:00
我之前研究了许久 fanric 是最佳解 其他都是垃圾
bairdshi
2020-10-23 15:26:36 +08:00
@bairdshi fabric 不小心打错了
bairdshi
2020-10-23 15:32:24 +08:00
from fabric import task, Connection
from invoke.tasks import call

# r represents raspberry pi
name_ip_mapping = {"r1": "192.168.122.3", "r2": "192.168.122.2",
"r3": "192.168.122.7", "camera": "192.168.122.55"}

ip_name_mapping = {v: k for k, v in name_ip_mapping.items()}


@task
def scp1(c):
"""
copy scripts to raspberry pi 1
"""
c = Connection(name_ip_mapping["r1"], user='pi', connect_kwargs={'password': 'xxxx'})
c.put('r1/main.py', "r1")
c.put('r1/config.py', "r1")
c.put('r1/part.py', "r1")
c.put('r1/logger.py', "r1")
wangyzj
2020-10-23 15:33:26 +08:00
paramiko
css3
2020-10-23 15:33:45 +08:00
把 a.txt 复制到 100 台服务器上, 这还不用 ansible ???
CallMeReznov
2020-10-23 15:46:22 +08:00
paramiko

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/717818

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX