使用scp将文件从一台服务器复制到另一台服务器时发送密码

时间:2013-12-06 17:36:00

标签: bash shell unix ksh scp

使用scp定期将文件从1个unix服务器复制到另一个服务器并执行某些操作。要快速执行此操作,我希望使用一个unix脚本来执行scp并输入完成scp所需的密码。

我已尝试使用expect命令通过unix命令行发送密码,但到目前为止无法实现此目的。

示例命令

scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"

我收到这些错误:

couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]
我错过了什么吗?

6 个答案:

答案 0 :(得分:20)

只需在sshpass -p "your password"命令

的开头传递scp即可
sshpass -p "your password" scp ./abc.txt hostname/abc.txt

答案 1 :(得分:6)

解决sshscpsftp(所有使用相同协议和sshd服务器)登录问题的方法之一是创建公共/私钥配对。

有些服务器可能不允许这样做,但大多数网站都没有。这些说明适用于Unix / Linux / Mac。与往常一样,虽然Windows上的cygwin环境确实遵循这些步骤,但Windows有点不同。

  • 在您的计算机上,使用ssh-keygen创建公钥/私钥。这可能因系统而异,但程序应引导您完成此操作。
  • ssh-keygen完成后,您的计算机上将有一个$HOME/.ssh目录。该目录将包含公钥和私钥。随着您的生成,将会生成另外两个文件。一个是known_hosts,其中包含您已登录的所有已知主机的指纹。第二个将被称为authorized_keysauthorized_keys2,具体取决于您的实施。
  • 如果它不存在,请登录远程主机,并在那里运行ssh-keygen。这将在那里生成$HOME/.ssh目录以及私钥/公钥对。如果$HOME/.ssh目录已存在且具有公钥和私钥文件,请不要这样做。你不想重新生成它。
  • $HOME/.ssh目录中的远程服务器上,创建名为authorized_keys的文件。在此文件中,输入您的公钥。此公钥位于本地计算机上的$HOME/.ssh目录中。它将以*.pub结束。将其内容粘贴到authorized_keys。如果authorized_keys已存在,请将您的公钥粘贴到下一行。

现在,当您使用ssh登录,或者使用scpsftp时,您将无需输入密码。顺便说一句,两台机器上的用户ID不必同意。我作为不同的用户登录了许多远程服务器并在authorized_keys中设置了我的公钥,并且没有直接登录该用户的问题。

在Windows上执行私有公钥认证

如果您使用Windows,则需要能够执行ssh的操作。我认识的大多数人都使用PuTTY来生成公钥/私钥,并在远程登录时执行key pairing。我不记得所有步骤,但是您生成了两个文件(一个包含公钥,一个包含私钥),并配置PuTTY以在登录远程站点时使用这两个文件。如果该远程站点是Linux / Unix / Mac,则可以复制公钥并将其放入authorized_keys文件中。

如果您可以使用SSH公钥/私钥,则可以不再需要脚本中的密码。否则,您必须使用Expect或Perl与Net::SSH之类的东西,它们可以监视远程主机并在提示时输入密码。

答案 2 :(得分:4)

您应该使用开放密钥进行更好的身份验证。在这种情况下,您不需要密码也不需要。

如果您想要expect,请使用此脚本(请参阅回答Automate scp file transfer using a shell script):

#!/usr/bin/expect -f

# connect via scp
    spawn scp "user@example.com:/home/santhosh/file.dmp" /u01/dumps/file.dmp
#######################
expect {
-re ".*es.*o.*" {
    exp_send "yes\r"
    exp_continue
}
-re ".*sword.*" {
    exp_send "PASSWORD\r"
}
}
interact

此外,您可以使用pexpect(python模块):

def doScp(user,password, host, path, files):
 fNames = ' '.join(files)
 print fNames
 child = pexpect.spawn('scp %s %s@%s:%s' % (fNames, user, host,path))
 print 'scp %s %s@%s:%s' % (fNames, user, host,path)
    i = child.expect(['assword:', r"yes/no"], timeout=30)
    if i == 0:
        child.sendline(password)
    elif i == 1:
        child.sendline("yes")
        child.expect("assword:", timeout=30)
        child.sendline(password)
    data = child.read()
    print data
    child.close()

答案 3 :(得分:2)

David提到的Firts,我们需要设置公钥/私钥。

然后使用下面的命令对我有用,意味着它没有提示我输入密码,因为我们使用-i选项在命令中传递私钥

scp -i path/to/private_key path/to/local/file remoteUserId@remoteHost:/path/to/remote/folder

此处path / to / private_key是我们在设置公钥/私钥时生成的私钥文件。

答案 4 :(得分:2)

//将/tmp/abc.txt复制到/tmp/abc.txt(目标路径)

// 10.1.1.2的用户名和密码是“username”和“password”

sshpass -p "password" scp /tmp/abc.txt username@10.1.1.2:/tmp/abc.txt

//安装sshpass(ubuntu)

sudo apt-get install sshpass

答案 5 :(得分:-2)

以下是我如何解决它。

这不是最安全的方式,但它解决了我的问题,因为安全性不是内部服务器上的问题。

创建一个新文件,说password.txt并存储要粘贴文件的服务器的密码。将其保存到主机服务器上的某个位置。

scp -W location/password.txt copy_file_location paste_file_location

干杯!