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

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

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

我发现了一个类似的Stack Overflow问题, 在Bash脚本中指定了sftp的密码 ,但是没有令人满意的答案来解决我的问题。

除了使用公钥authentication之外,还有几个选项:

  1. 使用钥匙串
  2. 使用sshpass (不太安全,但可能符合您的要求)
  3. 使用期望 (最不安全和更多的编码需要)

如果你决定给sshpass一个机会,这里是一个工作脚本片段来做到这一点:

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

另一种方法是使用lftp:

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

或者酷镜像方法(可以包括确认传输后删除' – 删除源文件'):

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

期待是一个伟大的计划使用。

在Ubuntu上安装它:

 sudo apt-get install expect 

在CentOS机器上安装:

 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 /中find的本地目录(文件名为file.log)上载到远程服务器上的“logdirectory”

您可以在shell脚本中交互使用lftp,以便通过执行以下操作将密码保存在.bash_history或类似文件中:

 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 

在你编辑put文件的主机,用户名,密码和目录之后,编写/退出vi编辑器。键入:wq 。然后使脚本可执行文件chmod +x test_script.sh ./test_script.sh并执行./test_script.sh

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

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

批示例:

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

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

您可以通过启用无密码authentication来覆盖。 但是你应该在安装之前先安装密钥(pub,priv)。

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

 Local $> ssh-keygen -t rsa 

按ENTER键提示所有选项。 没有值需要input。

 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 

在本地服务器执行以下命令来testing无密码authentication。 它应该没有密码连接。

 $> ssh user@targetmachine 

将sshpass与一个locking的证书文件结合起来,实际上,它和任何东西一样安全 – 如果你的机器上有根目录来读取证书文件,那么所有的注单都是closures的。

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

  1. 安装sshpass对于Ubuntu – sudo apt-get install sshpass
  2. 如果是第一次将远程IP添加到已知主机文件中对于Ubuntu – > ssh user @ IP – >input'yes'
  3. 给它一个scp和sshpass的组合命令。 下面是远程tomcat sshpass -p '#Password_For_remote_machine' scp /home/ubuntu/latest_build/abc.war #user@#RemoteIP:/var/lib/tomcat7/webapps

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

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

您可能需要安装期望,将“密码”的措辞更改为小写字母“p”,以便与提示符收到的内容相匹配。 这里的问题是,它在文件和命令历史logging中以纯文本forms显示密码。 这几乎打破了密码的目的。