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

che*_*891 11 unix bash shell ksh scp

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

我已经尝试了expect命令通过unix命令行发送密码,但到目前为止无法实现这一点.

示例命令

scp ./abc.txt hostname/abc.txt
expect "*password:*"
send "mypassword\r"
Run Code Online (Sandbox Code Playgroud)

我收到这些错误:

couldn't read file "password: ": no such file or directory
myscript.sh[5]: send: not found [No such file or directory]
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

Akk*_*kki 21

只需sshpass -p "your password"scp命令的开头传递即可

sshpass -p "your password" scp ./abc.txt hostname/abc.txt
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这没有用 (2认同)
  • 不要使用或安装 sshpass,因为它让 SSH 新手用户很容易破坏 SSH 的安全性。 (2认同)

Dav*_* W. 6

其中一个要解决登录问题与方式ssh,scp以及sftp(全部使用相同的协议和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或使用scp或登录时sftp,您将不需要输入密码.顺便说一句,两台机器上的用户ID不必同意.我作为不同的用户登录了许多远程服务器并设置了我的公钥,authorized_keys并且没有直接登录到该用户的问题.

在Windows上进行私有公钥认证

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

如果您可以使用SSH公钥/私钥,则可以消除脚本中对密码的需求.否则,您将不得不使用Expect或Perl与Net :: SSH之类的东西,它可以监视远程主机并在出现提示时输入密码.


Igo*_*bin 5

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

如果您想要它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
Run Code Online (Sandbox Code Playgroud)

此外,您可以使用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()
Run Code Online (Sandbox Code Playgroud)


che*_*891 -4

这是我解决的方法。

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

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

scp -W location/password.txt copy_file_location paste_file_location
Run Code Online (Sandbox Code Playgroud)

干杯!

  • scp 中有 w 选项吗?因为当我看到scp的man page时,没有w选项 (7认同)