关于shell:如何使用Bash脚本中的密码运行sftp命令?

How to run the sftp command with a password from Bash script?

我需要从Linux主机使用sftp将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享。

那么,有没有一种方法可以通过cron作业从bash脚本内部运行sftp命令(提供用户名/密码)?

我发现了一个类似的堆栈溢出问题,在bash脚本中指定sftp的密码,但对于我的问题没有令人满意的答案。


除了使用公钥身份验证之外,您还有几个选项:

  • 使用钥匙链
  • 使用sshspass(安全性较低,但可能满足您的要求)
  • 使用Expect(安全性最低,需要更多编码)
  • 如果您决定给sshspass一个机会,这里有一个工作脚本片段:

    1
    2
    3
    4
    5
    6
    export SSHPASS=your-password-here
    sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
       cd incoming
       put your-log-file.log
       bye
    !


    另一种方法是使用LFTP:

    1
    lftp sftp://user:password@host  -e"put local-file.name; bye"

    这种方法的缺点是,计算机上的其他用户可以从诸如ps之类的工具中读取密码,并且密码可以成为shell历史的一部分。

    由于LFTP 4.5.0设置了LFTP_PASSWORD环境变量,并使用--env-password执行了LFTP,因此提供了一种更安全的替代方案。下面是一个完整的例子:

    1
    2
    LFTP_PASSWORD="just_an_example"
    lftp --env-password sftp://user@host  -e"put local-file.name; bye"

    LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除"--remove source files"):

    1
    lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com


    Expect是一个很好的程序。

    在Ubuntu上安装:

    1
    sudo apt-get install expect

    在CentOS机器上安装:

    1
    yum install expect

    假设您希望连接到SFTP服务器,然后将本地文件从本地计算机上载到远程SFTP服务器。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/expect

    spawn sftp username@hostname.com
    expect"password:"
    send"yourpasswordhere
    "

    expect"sftp>"
    send"cd logdirectory
    "

    expect"sftp>"
    send"put /var/log/file.log
    "

    expect"sftp>"
    send"exit
    "

    interact

    这将使用您的服务器密码打开一个SFTP连接。

    然后它会转到要上载文件的目录,在本例中是"logdirectory"

    这会将一个日志文件从/var/log/中找到的本地目录上载到远程服务器上的"log directory",文件名为file.log。


    您可以在shell脚本中交互使用lftp,这样密码就不会保存在.bash_历史记录或类似文件中,方法是执行以下操作:

    1
    vi test_script.sh

    将以下内容添加到文件中:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #!/bin/sh
    HOST=<yourhostname>
    USER=<someusername>
    PASSWD=<yourpasswd>

    cd <base directory for your put file>

    lftp<<END_SCRIPT
    open sftp://$HOST
    user $USER $PASSWD
    put local-file.name
    bye
    END_SCRIPT

    在编辑输入:wq的put文件的主机、用户、pass和目录后,编写/退出vi编辑器,然后使脚本可执行chmod +x test_script.sh并执行./test_script.sh


    您可以通过启用无密码身份验证进行覆盖。但你应该先安装密钥(pub,priv),然后再进行安装。

    在本地服务器上执行以下命令。

    1
    Local $> ssh-keygen -t rsa

    按Enter键显示提示的所有选项。不需要键入任何值。

    1
    2
    3
    Local $> cd .ssh
    Local $> scp .ssh/id_rsa.pub user@targetmachine:
    Prompts for pwd$>  ENTERPASSWORD

    使用以下命令连接到远程服务器

    1
    2
    Local $> ssh user@targetmachine
    Prompts for pwd$> ENTERPASSWORD

    在远程服务器上执行以下命令

    1
    2
    3
    4
    5
    Remote $> mkdir .ssh
    Remote $> chmod 700 .ssh
    Remote $> cat id_rsa.pub >> .ssh/authorized_keys
    Remote $> chmod 600 .ssh/authorized_keys
    Remote $> exit

    在本地服务器上执行以下命令以测试无密码身份验证。它应该在没有密码的情况下连接。

    1
    $> ssh user@targetmachine


    我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是tectia ssh包,它有一个选项--password来在命令行上传递密码。

    示例:sftp --password="password""userid"@"servername"

    成批实例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    (
      echo"
      ascii
      cd pub
      lcd dir_name
      put filename
      close
      quit
       "

    ) | sftp --password="password""userid"@"servername"

    我想我应该分享这些信息,因为在运行帮助命令(sftp -h之前,我查看了各种网站,我很惊讶地看到了密码选项。


    将sshspass与一个锁定的凭证文件结合起来,实际上,它的安全性与任何东西都一样——如果您在框中有根来读取凭证文件,那么所有的赌注都将关闭。


    您可以使用sshspass。以下是步骤

  • 为Ubuntu-sudo apt-get install sshpass安装sshass
  • 如果是第一次,请将远程IP添加到已知主机文件中对于Ubuntu->ssh user@ip->enter'yes'
  • 为它发出scp和sshspass的组合命令。下面是一个针对远程Tomcat的战争应对示例代码sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

  • bash程序等待sftp请求密码,然后发送:

    1
    2
    3
    4
    5
    6
    7
    #!/bin/bash
    expect -c"
    spawn sftp username@your_host
    expect "
    Password"
    send "
    your_password_here
    "
    interact"

    您可能需要安装expect,将"password"的措辞更改为小写"p",以匹配您收到的提示。这里的问题是,它在文件和命令历史记录中以纯文本的形式公开您的密码。这几乎破坏了最初拥有密码的目的。