我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。
那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?
我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。
我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。
那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?
我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。
当前回答
我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是Tectia SSH包,它有一个选项——password,可以在命令行上传递密码。
example: sftp——密码=“用户密码”
批处理示例:
(
echo "
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password" "userid"@"servername"
我想我应该分享这个信息,因为我正在看各种网站,在运行帮助命令(sftp -h)之前,我很惊讶地看到密码选项。
其他回答
我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是Tectia SSH包,它有一个选项——password,可以在命令行上传递密码。
example: sftp——密码=“用户密码”
批处理示例:
(
echo "
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password" "userid"@"servername"
我想我应该分享这个信息,因为我正在看各种网站,在运行帮助命令(sftp -h)之前,我很惊讶地看到密码选项。
您可以在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文件的主机、用户、pass和目录后,输入:wq,然后编写/退出vi编辑器,使脚本可执行chmod +x test_script.sh并执行。/test_script.sh。
EXPECT是一个非常好用的程序。
在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/中上传一个文件名为file.log的日志文件到远程服务器上的“logdirectory”
另一种方法是使用lftp:
lftp sftp://user:password@host -e "put local-file.name; bye"
这种方法的缺点是,计算机上的其他用户可以从ps等工具读取密码,并且密码可能成为您的shell历史记录的一部分。
自LFTP 4.5.0以来,一个更安全的替代方法是设置LFTP_PASSWORD环境变量,并使用——env-password执行LFTP。下面是一个完整的例子:
export LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host -e "put local-file.name; bye"
# Destroy password after use
export LFTP_PASSWORD=""
LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除—Remove-source-files):
lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
将sshpass与一个锁定的凭据文件结合起来,在实践中,它就像任何东西一样安全-如果您已经在盒子上使用root来读取凭据文件,那么无论如何,一切都是错误的。