我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。
那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?
我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。
我需要从Linux主机使用sftp传输日志文件到远程主机。我的行动组也向我提供了同样的证书。但是,由于我没有对其他主机的控制权,我不能生成并与其他主机共享RSA密钥。
那么,是否有一种方法可以从Bash脚本内部通过cron作业运行sftp命令(提供用户名/密码)?
我发现一个类似的堆栈溢出问题,指定密码sftp在Bash脚本,但没有满意的答案,我的问题。
当前回答
除了使用公钥身份验证之外,您还有一些选择:
使用钥匙链 使用sshpass(安全性较低,但可能满足您的需求) 使用expect(安全性最低,需要编写更多代码)
如果你决定给sshpass一个机会,这里有一个工作脚本片段:
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
cd incoming
put your-log-file.log
bye
!
其他回答
一些人提到了sshpass,但没有太多清晰的编码示例……
这是我们使用bash脚本进行rsync备份的方式:
sshpass -p "${RSYNC_PASSWORD}" sftp "${RSYNC_USER}"@"${RSYNC_REMOTE_HOST}"
请记住,在正常工作之前,您必须sudo apt安装sshpass。
您可以通过启用无密码身份验证来覆盖。但是你应该先安装密钥(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
我最近被要求从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)之前,我很惊讶地看到密码选项。
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”
我发现最简单的方法来实现这一点,不需要安装任何第三方库,如Expect, SSHPASS…等等,是通过使用CURL和SFTP的组合。这两个程序几乎在每台Linux机器上都有。
这是在更改值之后应该执行的命令。
curl -k "sftp://SERVER_IP:SERVER_PORT/FULL_PATH_OF_THE_FILE" --user "SERVER_USER:SERVER_PASSOWRD" -o "THE_NAME_OF_THE_FILE_AFTER_DOWNLOADING_IT"
例子:
curl -k "sftp://10.10.10.10:77/home/admin/test.txt" --user "admin:123456" -o "test.txt"
解释:
我们正在使用用户名admin和密码123456连接到服务器10.10.10.10:77,以将文件/home/admin/test.txt从该服务器移动到您当前用于执行上述命令的服务器。