同时使用SSH和SFTP时重复输密码的替代解决方案求助
问题描述
我编写了一个从远程服务器拉取日志文件的工作脚本,流程如下:
- 用户输入用户名及两个日志文件名;
- 通过SSH执行
ls -ltr命令查看文件大小; - 用户确认后,用SFTP拉取目标文件。
当前遇到的问题是:SSH和SFTP操作会分别要求输入密码,且管理员禁用了sshpass工具,无法用它跳过密码输入,寻求替代解决方法。
附上当前脚本代码:
#!/bin/bash read -p "UserID: " UserID read -p "Error file: " file1 read -p "Log file: " file2 ssh $UserID@127.0.0.1 "ls -ltr /logs/$file1 && ls -ltr /logs/$file2" read -p "Please check the file size, do you want to proceed? (y/n): " choice if [[ "$choice" == "y" ]] then sftp $UserID@127.0.0.1 << EOF get /logs/$file1 /home/ get /logs/$file2 /home/ EOF else echo "Exiting..." exit fi
解决方案
方案1:SSH密钥对认证(彻底免密)
这是最推荐的长期解决方案,配置一次后即可永久免密连接:
生成SSH密钥对:在本地终端执行以下命令,全程按回车使用默认配置(不要设置密钥密码,否则每次连接仍需输入):
ssh-keygen -t ed25519(若系统不支持ed25519算法,可替换为
ssh-keygen -t rsa -b 4096)上传公钥到远程服务器:用
ssh-copy-id工具一键完成公钥部署,执行时需输入一次远程用户密码:ssh-copy-id $UserID@127.0.0.1验证:重新运行脚本,SSH和SFTP操作都不会再要求输入密码。
方案2:SSH连接复用(仅输一次密码)
如果暂时无法配置密钥对,可利用SSH连接复用特性,让SSH和SFTP共享同一个连接,只需输入一次密码:
修改后的脚本如下:
#!/bin/bash # 定义控制套接字路径,用于标识复用的连接 CONTROL_SOCKET="/tmp/ssh_control_$UserID@127.0.0.1" read -p "UserID: " UserID read -p "Error file: " file1 read -p "Log file: " file2 # 建立可复用的控制连接,并执行文件查看命令 ssh -o ControlMaster=yes -o ControlPath="$CONTROL_SOCKET" -o ControlPersist=60s $UserID@127.0.0.1 "ls -ltr /logs/$file1 && ls -ltr /logs/$file2" read -p "Please check the file size, do you want to proceed? (y/n): " choice if [[ "$choice" == "y" ]] then # 复用已建立的连接执行SFTP拉取 sftp -o ControlPath="$CONTROL_SOCKET" $UserID@127.0.0.1 << EOF get /logs/$file1 /home/ get /logs/$file2 /home/ EOF else echo "Exiting..." fi # 关闭复用连接,清理套接字文件 ssh -o ControlPath="$CONTROL_SOCKET" -O exit $UserID@127.0.0.1 exit
参数说明:
ControlMaster=yes:创建控制连接作为复用的主连接ControlPath:指定套接字文件路径,用于关联复用的连接ControlPersist=60s:主连接在最后一次使用后保持60秒,足够用户确认操作-O exit:最终关闭主连接,避免残留临时文件
内容的提问来源于stack exchange,提问作者John Llery
相关产品推荐
相关产品推荐

