如何使用Bash脚本中的密码运行sftp命令?
我需要使用Linux主机将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,所以无法生成RSA密钥并与其他主机共享 那么,有没有办法通过作业从Bash脚本内部运行如何使用Bash脚本中的密码运行sftp命令?,bash,shell,unix,ssh,sftp,Bash,Shell,Unix,Ssh,Sftp,我需要使用Linux主机将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,所以无法生成RSA密钥并与其他主机共享 那么,有没有办法通过作业从Bash脚本内部运行sftp命令(提供用户名/密码) 我发现了一个类似的堆栈溢出问题,但我的问题没有令人满意的答案。除了使用公钥身份验证之外,您还有一些选择: 使用 使用(安全性较低,但可能符合您的要求) 使用(安全性最低,需要更多编码) 如果您决定给sshpass一个机会,这里有一个工作脚本片段: export SS
sftp
命令(提供用户名/密码)
我发现了一个类似的堆栈溢出问题,但我的问题没有令人满意的答案。除了使用公钥身份验证之外,您还有一些选择:
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
cd incoming
put your-log-file.log
bye
!
export SSHPASS=此处输入密码
sshpass-e sftp-oBatchMode=no-b-sftp-user@remote-主机将sshpass与锁定的凭据文件结合在一起,实际上,它与任何东西一样安全-如果您有根用户来读取凭据文件,那么所有赌注都是无效的。EXPECT
是一个很好的使用程序
在Ubuntu上,使用以下软件安装:
sudo apt-get install expect
yum install expect
在CentOS机器上,使用以下设备安装:
sudo apt-get install expect
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”(日志目录)我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是tectiash包,它有一个选项--password
在命令行上传递密码
Remote $> mkdir .ssh
Remote $> chmod 700 .ssh
Remote $> cat id_rsa.pub >> .ssh/authorized_keys
Remote $> chmod 600 .ssh/authorized_keys
Remote $> exit
示例:sftp--password=“password”“userid”@“servername”
批处理示例:
(
echo "
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password" "userid"@"servername"
我想我应该分享这些信息,因为在运行help命令(sftp-h
)之前,我正在浏览各种网站,看到密码选项我很惊讶 另一种方法是使用lftp:
lftp sftp://user:password@host -e "put local-file.name; bye"
这种方法的缺点是,计算机上的其他用户可以从ps
等工具读取密码,密码可能成为shell历史记录的一部分
自LFTP 4.5.0以来可用的一个更安全的替代方案是设置LFTP_PASSWORD
环境变量,并使用--env PASSWORD
执行LFTP。下面是一个完整的示例:
LFTP_PASSWORD="just_an_example"
lftp --env-password sftp://user@host -e "put local-file.name; bye"
LFTP还包括一个很酷的镜像功能(可以包括确认传输后删除<代码>--删除源文件代码>):
通过执行以下操作,可以在shell脚本中交互使用lftp,使密码不保存在.bash_历史记录或类似文件中:
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
#/垃圾箱/垃圾箱
主人=
使用者=
PASSWD=
光盘
lftp您可以通过启用无密码身份验证来覆盖。但在开始之前,您应该安装密钥(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
Bash程序等待sftp请求密码,然后发送密码:
#!/bin/bash
expect -c "
spawn sftp username@your_host
expect \"Password\"
send \"your_password_here\r\"
interact "
您可能需要安装expect,将“Password”的措辞更改为小写的“p”,以匹配您收到的提示。这里的问题是,它在文件和命令历史记录中以纯文本形式公开您的密码。这几乎违背了一开始就拥有密码的目的。您可以使用sshpass。以下是步骤
为Ubuntu安装sshpass-sudo-apt-get-Install-sshpass
如果是第一次,请将远程IP添加到已知主机文件中
对于Ubuntu->sshuser@IP->输入“是”
为其发出scp和sshpass的联合命令。
下面是远程tomcat的示例代码
sshpass-p'#远程机器的密码"scp/home/ubuntu/latest_build/abc.war#user@#RemoteIP:/var/lib/tomcat7/webapps
您可以使用带有scp和os库的Python脚本进行系统调用
ssh keygen-t rsa-b 2048(本地计算机)
ssh副本iduser@remote_server_address
创建一个Python脚本,如:
在crontab中创建一个规则来自动化脚本
完成
在Mac上使用它:我认为不需要导出SSHPASS=password-SSHPASS-e…
应该可以。我可以用一行代码加载日志文件:SSHPASS-p“我的密码”sftp-oPort=9999user@host:dir/file.log
@gorus:One liner非常酷,但是我不想在命令行上使用密码,因为这会增加窥探风险。-oBatchMode=no
是我缺少的关键部分。谢谢你的回答,我希望这是我完成此任务的一个选项。谢谢。我通过搜索找到了您的答案,并使用它成功地用expect构建了一个脚本。刚刚发布了PoterityTank的脚本,非常感谢您的回答,我已经对它进行了升级:)我正在使用它输入ssh私钥的密码短语。在所有服务器上放置相同的公钥更方便,只需定期旋转私钥密码短语即可。+1为您提供了一个很好的建议。但是,这需要您在命令行上传递密码,系统中执行ps
命令的任何人都可以看到您的密码。我尝试过,得到了unknown选项---用法:sftp[-1246aCfpqrv][-B buffer\u size][B batchfile][c cipher][D sftp\u server\u path][F ssh U co