How to run the sftp command with a password from Bash script?
我需要从Linux主机使用sftp将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享。
那么,有没有一种方法可以通过cron作业从bash脚本内部运行
我发现了一个类似的堆栈溢出问题,在bash脚本中指定sftp的密码,但对于我的问题没有令人满意的答案。
除了使用公钥身份验证之外,您还有几个选项:
如果您决定给sshspass一个机会,这里有一个工作脚本片段:
1 2 3 4 5 6 | export SSHPASS=your-password-here sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << ! cd incoming put your-log-file.log bye ! |
另一种方法是使用LFTP:
1 | lftp sftp://user:password@host -e"put local-file.name; bye" |
这种方法的缺点是,计算机上的其他用户可以从诸如
由于LFTP 4.5.0设置了
1 2 | LFTP_PASSWORD="just_an_example" lftp --env-password sftp://user@host -e"put local-file.name; bye" |
LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除"--remove source files"):
1 | lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com |
Expect是一个很好的程序。
在Ubuntu上安装:
1 | sudo apt-get install expect |
在CentOS机器上安装:
1 | yum install expect |
假设您希望连接到SFTP服务器,然后将本地文件从本地计算机上载到远程SFTP服务器。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #!/usr/bin/expect spawn sftp username@hostname.com expect"password:" send"yourpasswordhere " expect"sftp>" send"cd logdirectory " expect"sftp>" send"put /var/log/file.log " expect"sftp>" send"exit " interact |
这将使用您的服务器密码打开一个SFTP连接。
然后它会转到要上载文件的目录,在本例中是"logdirectory"
这会将一个日志文件从/var/log/中找到的本地目录上载到远程服务器上的"log directory",文件名为file.log。
您可以在shell脚本中交互使用lftp,这样密码就不会保存在.bash_历史记录或类似文件中,方法是执行以下操作:
1 | vi test_script.sh |
将以下内容添加到文件中:
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/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 |
在编辑输入
您可以通过启用无密码身份验证进行覆盖。但你应该先安装密钥(pub,priv),然后再进行安装。
在本地服务器上执行以下命令。
1 | Local $> ssh-keygen -t rsa |
按Enter键显示提示的所有选项。不需要键入任何值。
1 2 3 | Local $> cd .ssh Local $> scp .ssh/id_rsa.pub user@targetmachine: Prompts for pwd$> ENTERPASSWORD |
使用以下命令连接到远程服务器
1 2 | Local $> ssh user@targetmachine Prompts for pwd$> ENTERPASSWORD |
在远程服务器上执行以下命令
1 2 3 4 5 | Remote $> mkdir .ssh Remote $> chmod 700 .ssh Remote $> cat id_rsa.pub >> .ssh/authorized_keys Remote $> chmod 600 .ssh/authorized_keys Remote $> exit |
在本地服务器上执行以下命令以测试无密码身份验证。它应该在没有密码的情况下连接。
1 | $> ssh user@targetmachine |
我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是tectia ssh包,它有一个选项
示例:
成批实例:
1 2 3 4 5 6 7 8 9 10 | ( echo" ascii cd pub lcd dir_name put filename close quit " ) | sftp --password="password""userid"@"servername" |
我想我应该分享这些信息,因为在运行帮助命令(
将sshspass与一个锁定的凭证文件结合起来,实际上,它的安全性与任何东西都一样——如果您在框中有根来读取凭证文件,那么所有的赌注都将关闭。
您可以使用sshspass。以下是步骤
bash程序等待sftp请求密码,然后发送:
1 2 3 4 5 6 7 | #!/bin/bash expect -c" spawn sftp username@your_host expect "Password" send "your_password_here " interact" |
您可能需要安装expect,将"password"的措辞更改为小写"p",以匹配您收到的提示。这里的问题是,它在文件和命令历史记录中以纯文本的形式公开您的密码。这几乎破坏了最初拥有密码的目的。