linux sftp账号密码脚本传文件,关于shell:如何使用Bash脚本中的密码运行sftp命令?...
我需要从Linux主机使用sftp将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享。那么,有没有一种方法可以通过cron作业从bash脚本内部运行sftp命令(提供用户名/密码)?我发现了一个类似的堆栈溢出问题,在bash脚本中指定sftp的密码,但对于我的问题没有令人满意的答案。除了使用公钥身份验证之外,您还有几个选
我需要从Linux主机使用sftp将日志文件传输到远程主机。我的操作组已为我提供了相同的凭据。但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享。
那么,有没有一种方法可以通过cron作业从bash脚本内部运行sftp命令(提供用户名/密码)?
我发现了一个类似的堆栈溢出问题,在bash脚本中指定sftp的密码,但对于我的问题没有令人满意的答案。
除了使用公钥身份验证之外,您还有几个选项:
使用钥匙链
使用sshspass(安全性较低,但可能满足您的要求)
使用Expect(安全性最低,需要更多编码)
如果您决定给sshspass一个机会,这里有一个工作脚本片段:
export SSHPASS=your-password-here
sshpass -e sftp -oBatchMode=no -b - sftp-user@remote-host << !
cd incoming
put your-log-file.log
bye
!
用于Mac:stackoverflow.com/questions/9102557/&hellip;
嗨,我也有类似的问题,我尝试使用expect,因为主机上没有其他的替代方案。有了EDOCX1[0]我就得到了这个错误。Permission denied (publickey,keyboard-interactive).。请告诉我如何使用bash脚本中的passwd连接到sftp主机。
请看,我在这里问过这个问题。stackoverflow.com/q/12508206/1135954
我想不需要出口。SSHPASS=password sshpass -e ...应该这样做。
@詹斯:同意这里不需要出口。
我可以用一行程序加载一个日志文件:sshpass -p"my_password" sftp -oPort=9999 user@host:dir/file.log。
@Gorus:一行程序非常酷,但是我不想在命令行上使用密码,因为这样会增加窥探风险。
@德鲁:是的,export SSHPASS=your-password-here进入了该用户的env,但是ps -ef如何显示不同用户的env?
埃多克斯1〔7〕是我最重要的缺件。
这对我不起作用…
你用了什么没用。既然这是一条非常古老的线索,请随意创建一个新问题。
嗨,阿努巴瓦-这是我的问题。stackoverflow.com/questions/24540156/&hellip;
我正在IBMAIX上工作,并尝试使用sftp命令从远程服务器获取文件…
嗨,阿努巴瓦-你能帮我讲讲这个剧本吗?我试过用,但没用。这是我在下面的链接中编写的代码。stackoverflow.com/questions/24540156/&hellip;
嗨,阿努巴瓦-运气好吗?
嗨,阿努巴瓦-我试过这三种方法,但没有一种对我有用……你能帮我一下吗?谢谢您。。。
在尝试sshpass命令时出现了什么错误?我每天都在我的系统上使用它。
sshspass:找不到命令-我找不到它
我在那台机器上没有安装新软件的根用户。我正在寻找一种不安装新软件的方法
我在没有根访问的情况下安装了它,但是讨论这将使这个问题偏离太多。
嗨,sshspass是个好主意,谢谢,工作得很好!但现在,每次通过crontab运行时,我都会收到一封邮件,其中包含这里脚本区域中的所有sftp命令。那么,有人知道如何抑制这个输出到控制台吗?
可以添加> ~/file.out 2>&1将输出和stderr重定向到文件。
@阿努巴瓦,谢谢,这个很好用!
@阿努巴瓦非常感谢你的回答。我将它与我的bash脚本文件一起使用,该文件是通过crontab-e启动的。我更改了感叹号"!"到"eof",因为crontab无法在脚本中识别此字符
另一种方法是使用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还包括一个很酷的镜像功能(可以包括确认传输后删除"--remove source files"):
lftp -e 'mirror -R /local/log/path/ /remote/path/' --env-password -u user sftp.foo.com
+1用于建议替代方案,但我们是否可以避免在命令行上提供密码?
拒绝向同一台计算机上的任何人显示密码
您可以为lftp创建脚本文件,这样就不必在命令行中提供密码。创建一个文件put-script:open sftp://user:password@host; put local-file.name; exit,然后运行lftp -f put-script,这样就不必在命令行中使用用户名和密码,并且可以设置对脚本文件的限制权限。
@这是个好主意。我想知道是否要将它作为别名或函数添加到我的环境变量中,是否安全并可以对其他用户隐藏它?
做lftp要比和sftp和sshpass混在一起容易得多。好答案。
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
"
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。
谢谢你的回答,我希望这是我完成这项任务的一个选择。
谢谢您。我通过搜索找到了你的答案,使用它并成功地用Expect构建了一个脚本。刚刚发布了关于权力的剧本
非常感谢你的回答,我已经投了反对票:)
这对我来说毫无瑕疵。谢谢您!
我用这个输入ssh私钥的密码。在所有服务器上放置相同的公钥并定期旋转私钥密码短语更容易。
您可以在shell脚本中交互使用lftp,这样密码就不会保存在.bash_历史记录或类似文件中,方法是执行以下操作:
vi test_script.sh
将以下内容添加到文件中:
#!/bin/sh
HOST=
USER=
PASSWD=
cd
lftp<
open sftp://$HOST
user $USER $PASSWD
put local-file.name
bye
END_SCRIPT
在编辑输入:wq的put文件的主机、用户、pass和目录后,编写/退出vi编辑器,然后使脚本可执行chmod +x test_script.sh并执行./test_script.sh。
要覆盖现有文件,请在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
+1问你的答案,但问题是在没有公钥/私钥的情况下进行。
哎呀。。刚刚看到密钥共享的限制:)
出于好奇,当从shell脚本调用时,这个命令lftp -p ${port} -u ${login_id},${password} ${ip_number}会在哪里打印它们?除了sshspass,你是怎么解决的?
我没有lftp,并且同时依赖Mac和Linux的sshpass。
纯金。谢谢!:)
提示:如果要为其他远程服务器设置此设置,请将相同的id_rsa.pub复制到远程服务器。公钥id_rsa.pub在本地服务器上生成一次,并与需要设置无密码身份验证的所有远程主机共享。
我最近被要求从ftp切换到sftp,以确保服务器之间的文件传输安全。我们使用的是tectia ssh包,它有一个选项--password来在命令行上传递密码。
示例:sftp --password="password""userid"@"servername"。
成批实例:
(
echo"
ascii
cd pub
lcd dir_name
put filename
close
quit
"
) | sftp --password="password""userid"@"servername"
我想我应该分享这些信息,因为在运行帮助命令(sftp -h之前,我查看了各种网站,我很惊讶地看到了密码选项。
+给你一个好建议。但是,这将要求您在命令行上传递密码,系统中执行ps命令的任何人都可以看到您的密码。
我试过了,我找到了EDOCX1[0]
@我可能是因为你需要techia ssh,而不是openssh
将sshspass与一个锁定的凭证文件结合起来,实际上,它的安全性与任何东西都一样——如果您在框中有根来读取凭证文件,那么所有的赌注都将关闭。
您可以使用sshspass。以下是步骤
为Ubuntu-sudo apt-get install sshpass安装sshass
如果是第一次,请将远程IP添加到已知主机文件中对于Ubuntu->ssh user@ip->enter'yes'
为它发出scp和sshspass的组合命令。下面是一个针对远程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
"
interact"
您可能需要安装expect,将"password"的措辞更改为小写"p",以匹配您收到的提示。这里的问题是,它在文件和命令历史记录中以纯文本的形式公开您的密码。这几乎破坏了最初拥有密码的目的。
+1但我认为你清楚地说明了这种方法的问题所在。
更多推荐
所有评论(0)