You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无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

关键说明

  1. 密码传递逻辑:远程脚本先主动读取标准输入的两行内容(即本地传递的两个密码),再通过管道将密码精准传递给需要交互的ssh和git进程,而非依赖终端自动转发输入。
  2. 特殊字符处理:本地读取密码时用read -rs,避免特殊字符(如$、\)被bash解析;远程读取时用read -r,保留原始字符。
  3. git的ssh复用:通过GIT_SSH_COMMAND指定git使用已建立的ssh控制套接字,确保密码传递给正确的ssh进程。

前置准备

确保远程脚本拥有执行权限:

ssh user@remote_host "chmod +x /path/to/remote_script.bs"

内容的提问来源于stack exchange,提问作者lumen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 02:57:35