SCP Through python 未传输文件
SCP Through python is not transferring file
我有两个 Raspberry Pi。我正在尝试使用 scp 将文件从一个 Pi 传输到另一个 Pi。我正在尝试通过 Python 执行此操作,因为将要传输文件的程序是一个 python 文件。
下面是我为 SCP 部分准备的 shell 脚本(模糊了密码和 IP):
#!/bin/sh
sshpass -p ######## scp test.txt pi@IP:/home/pi
下面是启动该 Shell 脚本的 Python 脚本。
import subprocess
subprocess.call(['./ssh.sh'])
print("DONE")
出于某种原因,python 脚本没有回滚任何错误并命中打印行,但文件未传输。当我 运行 python 之外的 scp 命令时,文件传输正常。我在这里做错了什么吗?
****编辑****
我什至不能让 Subprocess 处理这个,这就是我最终使用 na shell 脚本的原因。这是我对子进程的尝试:
import subprocess
subprocess.call("sshpass -p ######## scp test.txt pi@IP:/home/pi")
print"DONE"
我再次没有收到任何错误,但文件未传输
****编辑 #2****
所以我发现因为正在使用 sshpass,scp 没有提示我将 IP 添加到已知主机,结果文件根本就没有被传输。我需要一种方法来将这种接受添加到脚本 IE 中,如果我在没有 sshpass 的情况下启动命令,我会得到以下信息:
The authenticity of host 'IP (IP)' can't be established.
ECDSA key fingerprint is 13:91:24:8e:6f:21:98:1f:5b:3a:c8:42:7a:88:e9:91.
Are you sure you want to continue connecting (yes/no)?
我想通过 "yes\n" 传递给这个提示以及之后的密码。这可能吗?
第一次查询
您可以使用'subprocess.popen'获取执行命令的输出(STDOUT)和错误(STDERR)。
import subprocess
cmd = 'sshpass -p ****** scp dinesh.txt root@256.219.210.135:/root'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "Output is ",out
print "Error is ",err
如果你用错误的密码执行上面的代码,你将得到以下输出:
[root@centos /]# python code.py
Output is
Error is Permission denied, please try again.
在这种情况下,如果文件传输成功,则没有任何输出。
如果你执行像 'ls -l' 这样的命令,那么将打印输出。
对于你的第二个查询(****编辑#2****)
选项是:
- 无密码 SSH。 Check this.
- Pexpect
我找到了一种更简单的方法来解决所有这些问题
sshpass -p ###### scp -o StrictHostKeyChecking=no test.txt pi@IP:/home/pi
-o 开关允许我将 IP 自动存储到已知主机中,因此我根本不需要与 shell 通信。从 Python 到 Shell 的交互适用于该加法;仅通过子流程执行此操作也有效。
如果您不介意尝试其他方法,那么值得使用来自 scp 导入的 SCPClient。
我有两个 Raspberry Pi。我正在尝试使用 scp 将文件从一个 Pi 传输到另一个 Pi。我正在尝试通过 Python 执行此操作,因为将要传输文件的程序是一个 python 文件。
下面是我为 SCP 部分准备的 shell 脚本(模糊了密码和 IP):
#!/bin/sh
sshpass -p ######## scp test.txt pi@IP:/home/pi
下面是启动该 Shell 脚本的 Python 脚本。
import subprocess
subprocess.call(['./ssh.sh'])
print("DONE")
出于某种原因,python 脚本没有回滚任何错误并命中打印行,但文件未传输。当我 运行 python 之外的 scp 命令时,文件传输正常。我在这里做错了什么吗?
****编辑****
我什至不能让 Subprocess 处理这个,这就是我最终使用 na shell 脚本的原因。这是我对子进程的尝试:
import subprocess
subprocess.call("sshpass -p ######## scp test.txt pi@IP:/home/pi")
print"DONE"
我再次没有收到任何错误,但文件未传输
****编辑 #2****
所以我发现因为正在使用 sshpass,scp 没有提示我将 IP 添加到已知主机,结果文件根本就没有被传输。我需要一种方法来将这种接受添加到脚本 IE 中,如果我在没有 sshpass 的情况下启动命令,我会得到以下信息:
The authenticity of host 'IP (IP)' can't be established.
ECDSA key fingerprint is 13:91:24:8e:6f:21:98:1f:5b:3a:c8:42:7a:88:e9:91.
Are you sure you want to continue connecting (yes/no)?
我想通过 "yes\n" 传递给这个提示以及之后的密码。这可能吗?
第一次查询
您可以使用'subprocess.popen'获取执行命令的输出(STDOUT)和错误(STDERR)。
import subprocess
cmd = 'sshpass -p ****** scp dinesh.txt root@256.219.210.135:/root'
p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "Output is ",out
print "Error is ",err
如果你用错误的密码执行上面的代码,你将得到以下输出:
[root@centos /]# python code.py
Output is
Error is Permission denied, please try again.
在这种情况下,如果文件传输成功,则没有任何输出。 如果你执行像 'ls -l' 这样的命令,那么将打印输出。
对于你的第二个查询(****编辑#2****)
选项是:
- 无密码 SSH。 Check this.
- Pexpect
我找到了一种更简单的方法来解决所有这些问题
sshpass -p ###### scp -o StrictHostKeyChecking=no test.txt pi@IP:/home/pi
-o 开关允许我将 IP 自动存储到已知主机中,因此我根本不需要与 shell 通信。从 Python 到 Shell 的交互适用于该加法;仅通过子流程执行此操作也有效。
如果您不介意尝试其他方法,那么值得使用来自 scp 导入的 SCPClient。