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)。
原理说明
- 临时文件:隔离远程命令的stdout(仅保存最终结果),避免提示信息混入变量。
>&2重定向:将自定义提示输出到stderr(终端),不干扰stdout的结果捕获。ssh -t选项:强制分配伪终端,确保su能直接与本地终端交互,正常显示密码提示并接收输入。
内容的提问来源于stack exchange,提问作者monk
相关产品推荐
相关产品推荐

