SCP通过python不传输文件

时间:2016-07-19 19:41:24

标签: python shell raspberry-pi scp

我有两个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命令时,文件传输就好了。我在这里做错了吗?

**** **** EDIT
我甚至无法让Subprocess使用这个,这就是为什么我最终使用na shell脚本。这是我对Subprocess的尝试:

import subprocess
subprocess.call("sshpass -p ######## scp test.txt pi@IP:/home/pi")
print"DONE"

我再次没有错误,但文件未被转移

<***>
****编辑#2 ****
所以我发现因为正在使用sshpass,scp不会提示我将IP添加到已知主机,因此文件根本不是trnasferred。如果我在不使用sshpass的情况下启动命令,我需要一种方法将此接受添加到脚本IE中以下内容:

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)?


我想传达通过&#34;是\ n&#34;到此提示以及之后的密码。这可能吗?

3 个答案:

答案 0 :(得分:0)

第一次查询

您可以使用&#39; subprocess.popen&#39;获取执行命令的输出(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.

在这种情况下,如果文件成功传输,则没有输出。 如果你执行像&#39; ls -l&#39;这样的命令然后打印输出。

第二次查询(****编辑#2 ****)

选项包括:

  1. 密码少SSH。 Check this.
  2. Pexpect

答案 1 :(得分:0)

我找到了一种更简单的方法来处理所有这些

sshpass -p ###### scp -o StrictHostKeyChecking=no test.txt  pi@IP:/home/pi

-o开关允许我将IP自动存储到已知主机中,因此我根本不需要与shell通信。从Python到Shell的交互与该添加一起工作;仅通过子进程执行此操作也可以。

答案 2 :(得分:0)

如果你不介意尝试其他方法,那么从scp import中使用SCPClient是值得的。