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

如何使用Bash脚本中的密码运行sftp命令?,bash,shell,unix,ssh,sftp,Bash,Shell,Unix,Ssh,Sftp,我需要使用Linux主机将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,所以无法生成RSA密钥并与其他主机共享 那么,有没有办法通过作业从Bash脚本内部运行sftp命令(提供用户名/密码) 我发现了一个类似的堆栈溢出问题,但我的问题没有令人满意的答案。除了使用公钥身份验证之外,您还有一些选择: 使用 使用(安全性较低,但可能符合您的要求) 使用(安全性最低,需要更多编码) 如果您决定给sshpass一个机会,这里有一个工作脚本片段: export SS

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

那么,有没有办法通过作业从Bash脚本内部运行
sftp
命令(提供用户名/密码)


我发现了一个类似的堆栈溢出问题,但我的问题没有令人满意的答案。

除了使用公钥身份验证之外,您还有一些选择:

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

    export SSHPASS=your-password-here
    sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
       cd incoming
       put your-log-file.log
       bye
    !
    
    export SSHPASS=此处输入密码
    
    sshpass-e sftp-oBatchMode=no-b-sftp-user@remote-主机将sshpass与锁定的凭据文件结合在一起,实际上,它与任何东西一样安全-如果您有根用户来读取凭据文件,那么所有赌注都是无效的。

    EXPECT
    是一个很好的使用程序

    在Ubuntu上,使用以下软件安装:

    sudo apt-get install expect
    
    yum install expect
    
    在CentOS机器上,使用以下设备安装:

    sudo apt-get install expect
    
    yum install expect
    
    假设您希望连接到sftp服务器,然后将本地文件从本地计算机上载到远程sftp服务器

    #!/usr/bin/expect
    
    spawn sftp username@hostname.com
    expect "password:"
    send "yourpasswordhere\n"
    expect "sftp>"
    send "cd logdirectory\n"
    expect "sftp>"
    send "put /var/log/file.log\n"
    expect "sftp>"
    send "exit\n"
    interact
    
    这将使用您的密码打开到服务器的sftp连接

    然后它转到您想要上传文件的目录,在本例中为“logdirectory”


    这会将位于/var/log/的本地目录中的日志文件(文件名为file.log)上载到远程服务器上的“logdirectory”(日志目录)

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

    Remote $> mkdir .ssh
    Remote $> chmod 700 .ssh
    Remote $> cat id_rsa.pub >> .ssh/authorized_keys
    Remote $> chmod 600 .ssh/authorized_keys
    Remote $> exit
    
    示例:
    sftp--password=“password”“userid”@“servername”

    批处理示例:

    (
      echo "
      ascii
      cd pub
      lcd dir_name
      put filename
      close
      quit
        "
    ) | sftp --password="password" "userid"@"servername"
    

    我想我应该分享这些信息,因为在运行help命令(
    sftp-h
    )之前,我正在浏览各种网站,看到密码选项我很惊讶

    另一种方法是使用lftp:

    lftp sftp://user:password@host  -e "put local-file.name; bye"
    
    这种方法的缺点是,计算机上的其他用户可以从
    ps
    等工具读取密码,密码可能成为shell历史记录的一部分

    自LFTP 4.5.0以来可用的一个更安全的替代方案是设置
    LFTP_PASSWORD
    环境变量,并使用
    --env PASSWORD
    执行LFTP。下面是一个完整的示例:

    LFTP_PASSWORD="just_an_example"
    lftp --env-password sftp://user@host  -e "put local-file.name; bye"
    
    LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除<代码>--删除源文件):


    通过执行以下操作,可以在shell脚本中交互使用lftp,使密码不保存在.bash_历史记录或类似文件中:

    vi test_script.sh
    
    将以下内容添加到您的文件中:

    #!/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
    
    #/垃圾箱/垃圾箱
    主人=
    使用者=
    PASSWD=
    光盘
    
    lftp您可以通过启用无密码身份验证来覆盖。但在开始之前,您应该安装密钥(pub、priv)

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

    Local $> ssh-keygen -t rsa 
    
    按ENTER键显示所有提示选项。不需要键入任何值

    Local $> cd .ssh
    Local $> scp .ssh/id_rsa.pub user@targetmachine:
    Prompts for pwd$>  ENTERPASSWORD
    
    使用以下命令连接到远程服务器

    Local $> ssh user@targetmachine
    Prompts for pwd$> ENTERPASSWORD
    
    在远程服务器上执行以下命令

    Remote $> mkdir .ssh
    Remote $> chmod 700 .ssh
    Remote $> cat id_rsa.pub >> .ssh/authorized_keys
    Remote $> chmod 600 .ssh/authorized_keys
    Remote $> exit
    
    在本地服务器上执行以下命令以测试无密码身份验证。 它应该在没有密码的情况下连接

    $> ssh user@targetmachine
    

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

    #!/bin/bash
    expect -c "
    spawn sftp username@your_host
    expect \"Password\"
    send \"your_password_here\r\"
    interact "
    

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

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

  • 为Ubuntu安装sshpass-
    sudo-apt-get-Install-sshpass
  • 如果是第一次,请将远程IP添加到已知主机文件中 对于Ubuntu->sshuser@IP->输入“是”
  • 为其发出scp和sshpass的联合命令。 下面是远程tomcat的示例代码
    sshpass-p'#远程机器的密码"scp/home/ubuntu/latest_build/abc.war#user@#RemoteIP:/var/lib/tomcat7/webapps

  • 您可以使用带有scp和os库的Python脚本进行系统调用

  • ssh keygen-t rsa-b 2048(本地计算机)
  • ssh副本iduser@remote_server_address
  • 创建一个Python脚本,如:
  • 在crontab中创建一个规则来自动化脚本
  • 完成

  • 在Mac上使用它:我认为不需要导出
    SSHPASS=password-SSHPASS-e…
    应该可以。我可以用一行代码加载日志文件:
    SSHPASS-p“我的密码”sftp-oPort=9999user@host:dir/file.log
    @gorus:One liner非常酷,但是我不想在命令行上使用密码,因为这会增加窥探风险。
    -oBatchMode=no
    是我缺少的关键部分。谢谢你的回答,我希望这是我完成此任务的一个选项。谢谢。我通过搜索找到了您的答案,并使用它成功地用expect构建了一个脚本。刚刚发布了PoterityTank的脚本,非常感谢您的回答,我已经对它进行了升级:)我正在使用它输入ssh私钥的密码短语。在所有服务器上放置相同的公钥更方便,只需定期旋转私钥密码短语即可。+1为您提供了一个很好的建议。但是,这需要您在命令行上传递密码,系统中执行
    ps
    命令的任何人都可以看到您的密码。我尝试过,得到了
    unknown选项---用法:sftp[-1246aCfpqrv][-B buffer\u size][B batchfile][c cipher][D sftp\u server\u path][F ssh U co