【问题标题】:Send password when using scp to copy files from one server to another [duplicate]使用 scp 将文件从一台服务器复制到另一台服务器时发送密码 [重复]
【发布时间】:2013-12-24 04:06:55
【问题描述】:

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

我已经尝试过通过 unix 命令行发送密码的 expect 命令,但目前无法实现。

示例命令

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]

我错过了什么吗?

【问题讨论】:

  • 只需设置一个密钥对 - 参见例如stackoverflow.com/questions/19625833/…
  • 我正在使用的服务器对不允许使用 SSH 密钥对
  • 您应该将该信息添加到您的问题中以避免进一步混淆。

标签: bash shell unix ksh scp


【解决方案1】:

只需在scp 命令的开头加上sshpass -p "your password" 即可

sshpass -p "your password" scp ./abc.txt hostname/abc.txt

【讨论】:

  • 很遗憾这不起作用
  • 很适合我 :)
  • 不要使用或安装 sshpass,因为它让 SSH 新手很容易破坏 SSH 的安全性。
  • 使用单引号,而不是双引号
  • 为我工作,只需要安装 sshpass -> sudo apt install sshpass on ubuntu 和上述命令。
【解决方案2】:

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

如果您想使用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】:

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

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

    • 在您的计算机上,使用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 已存在,请将您的公钥粘贴到下一行。

    现在,当您使用sshscpsftp 登录时,您无需输入密码。顺便说一句,两台机器上的用户 ID 不必一致。我以不同的用户身份登录了许多远程服务器,并在authorized_keys 中设置了我的公钥,直接登录该用户没有问题。

    在 Windows 上进行私有公钥认证

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

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

    【讨论】:

    • 感谢您的解释,也许我应该提到我正在使用的服务器对不允许使用 SSH 密钥对
    • 那么,您唯一的希望是在 Perl 中使用 Expect 或 Net::SSH 或在 Python 中使用 SSH 包(我不熟悉这种用法。Perl 和我相信 Python 包将允许您可以自动向 SSH 发送密码。没有命令行参数可以传递给 SSH 密码。出于安全原因,这样做是出于安全原因。解决此问题的唯一方法是某种可以假装的程序在提示符处输入密码。
    • @cherry2891 是的,管理员可以禁用 ssh 密钥/配对(正如我在回答中提到的),据称是出于安全原因。当然,如果您必须使用密码自动登录,那么最终有人会编写一个带有明文密码的 Expect/Perl/Python 脚本,供全世界阅读。 <sarcasm>这真的很安全。</sarcasm> 使用 Expect/Perl/Python 路线(如果您在 Windows 上,PowerShell 可能也可以这样做),或者与管理员讨论自动下载的需求。
    【解决方案4】:

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

    // 10.1.1.2的用户名和密码为“用户名”和“密码”

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

    // 安装 sshpass (ubuntu)

    sudo apt-get install sshpass
    

    【讨论】:

    • 请在此代码中添加评论。
    【解决方案5】:

    首先正如大卫所说,我们需要设置公钥/私钥。

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

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

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

    【讨论】:

      【解决方案6】:

      这是我的解决方法。

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

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

      scp -W location/password.txt copy_file_location paste_file_location
      

      干杯!

      【讨论】:

      • 它对我不起作用。 Fedora 18.
      • scp 中有 w 选项吗?因为当我看到scp的man page时,没有w的选项
      • 没有W等选项
      猜你喜欢
      • 2014-05-17
      • 1970-01-01
      • 2016-02-26
      • 2021-06-22
      • 2018-07-08
      • 1970-01-01
      • 2020-06-18
      • 1970-01-01
      • 2011-02-05
      相关资源
      最近更新 更多