无expect/sshpass时,如何通过SSH远程脚本传递多用户输入?
解决SSH远程执行多交互命令(无expect/sshpass)的密码传递问题
你的问题出在:远程脚本里的ssh和git pull是独立进程,它们会各自尝试读取终端输入,但你通过EOF传递的内容只会进入远程脚本本身的标准输入,不会自动转发给这两个命令,所以导致认证失败。
下面是修改后的可行方案:
修改后的本地脚本
#!/bin/bash echo -n "Password 1: " read -rs password_1 echo echo -n "Password 2: " read -rs password_2 echo # 将两个密码按顺序通过标准输入传给远程脚本 result=$(ssh -t user@remote_host "/path/to/remote_script.bs" 2>&1 <<EOF $password_1 $password_2 EOF ) echo "$result"
修改后的远程脚本(remote_script.bs)
#!/bin/bash # 从标准输入读取两行密码,分别对应ssh和git认证 read -r password_1 read -r password_2 # 将第一个密码通过管道传给ssh命令的标准输入,建立端口转发 echo "$password_1" | ssh -M -S ".ssh_socket" -fNT "fixed_user@git_server" -L 1234:192.168.24.99:22 # 用管道将第二个密码传给git的ssh进程,同时指定使用已建立的ssh套接字 echo "$password_2" | GIT_SSH_COMMAND='ssh -S ".ssh_socket"' git --git-dir "path_to_git/.git" pull
关键说明
- 密码传递逻辑:远程脚本先主动读取标准输入的两行内容(即本地传递的两个密码),再通过管道将密码精准传递给需要交互的
ssh和git进程,而非依赖终端自动转发输入。 - 特殊字符处理:本地读取密码时用
read -rs,避免特殊字符(如$、\)被bash解析;远程读取时用read -r,保留原始字符。 - git的ssh复用:通过
GIT_SSH_COMMAND指定git使用已建立的ssh控制套接字,确保密码传递给正确的ssh进程。
前置准备
确保远程脚本拥有执行权限:
ssh user@remote_host "chmod +x /path/to/remote_script.bs"
内容的提问来源于stack exchange,提问作者lumen
相关产品推荐
相关产品推荐

