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

SSH+su场景下保留区分密码提示并存储命令输出的方法

解决SSH+SU双密码提示区分并捕获输出的方案

问题分析

你需要在SSH登录和切换root时显示明确的密码提示,同时把最终命令(如hostname)的输出存入变量。核心矛盾是:直接用命令替换$(...)会导致su的密码提示无法正常显示,而单纯输出提示到stdout又会干扰变量捕获。

可行方案:利用临时文件分离提示与输出

通过临时文件单独存储远程命令的输出结果,让所有密码提示直接输出到终端(stderr),同时保证su能通过SSH的伪终端正常获取密码输入。

具体命令如下:

# 创建临时文件用于存储命令输出
temp_file=$(mktemp)

# 显示SSH登录密码提示前缀,输出到终端(stderr)
printf "For User foo enter " >&2

# 执行SSH连接,远程端先显示root密码提示前缀,再执行su命令
# 将远程命令的stdout重定向到临时文件,仅保留最终结果
ssh -tq foo@12.13.14.15 '
  printf "Enter root " >&2
  su root -c hostname
' > "$temp_file"

# 将临时文件内容读取到变量
output=$(cat "$temp_file")

# 清理临时文件
rm "$temp_file"

# 验证变量内容(可选)
echo "捕获的命令输出:$output"

效果说明

执行后终端会显示:

For User foo enter Password:
Enter root Password:

输入对应密码后,$output变量将存储hostname的结果(如foobarzoo)。

原理说明

  1. 临时文件:隔离远程命令的stdout(仅保存最终结果),避免提示信息混入变量。
  2. >&2重定向:将自定义提示输出到stderr(终端),不干扰stdout的结果捕获。
  3. ssh -t选项:强制分配伪终端,确保su能直接与本地终端交互,正常显示密码提示并接收输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 17:01:19