如何使用Bash脚本的密码运行sftp命令?
我需要从Linux主机使用sftp将日志文件传输到远程主机。 我已经从我的操作组提供了相同的凭据。 但是,由于我不能控制其他主机,所以无法与其他主机生成和共享RSA密钥。
那么是否有办法通过cron作业从Bash脚本内部运行sftp
命令(提供用户名/密码)?
我发现了一个类似的Stack Overflow问题, 在Bash脚本中指定了sftp的密码 ,但是没有令人满意的答案来解决我的问题。
除了使用公钥authentication之外,还有几个选项:
- 使用钥匙串
- 使用sshpass (不太安全,但可能符合您的要求)
- 使用期望 (最不安全和更多的编码需要)
如果你决定给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。 以下是步骤
- 安装sshpass对于Ubuntu –
sudo apt-get install sshpass
- 如果是第一次将远程IP添加到已知主机文件中对于Ubuntu – > ssh user @ IP – >input'yes'
- 给它一个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显示密码。 这几乎打破了密码的目的。