通过SSH远程执行sudo命令并本地解析输出的问题求助
优雅解决远程sudo命令输出本地处理的密码提示问题
我来给你一个完美解决这个问题的方案,既能保留sudo的安全密码输入(不会明文显示),又能让密码提示正常显示给你,同时命令的输出还能被本地管道正确处理——就算第一次输错密码,sudo也会正常再次提示,完全不会失效。
最优命令示例
ssh -t remote 'sudo echo bar' 2>&1 | awk '/password/ {print > "/dev/stderr"; next} {print}' | tr bar foo
执行后你会看到正常的密码提示,输入密码时是隐藏的,命令输出则会被tr正确处理:
richard@local:~$ ssh -t remote 'sudo echo bar' 2>&1 | awk '/password/ {print > "/dev/stderr"; next} {print}' | tr bar foo [sudo] password for richard: foo
方案原理拆解
-t选项:给SSH分配伪终端,让sudo可以从终端读取密码,实现安全的隐藏输入(这比-S从stdin读密码更安全)。2>&1:把远程服务器的stderr(也就是sudo的密码提示)合并到stdout,这样我们可以用后续的awk统一处理输出内容。- awk脚本:负责分离密码提示和命令输出——包含"password"的行(即sudo的提示)被重定向到本地的stderr,直接显示给你;其他行(命令的实际输出)则继续传给后面的
tr命令处理。
对比之前方案的优势
- 你的临时方案
echo "[sudo]...":当密码输入错误时,sudo的第二次提示不会被显示,你根本不知道要重新输入,直接卡住。 - 你的
read -s password方案:密码会通过管道传给sudo,虽然read -s隐藏了输入,但本质是把密码明文写入管道,存在被劫持的风险;而且用-S让sudo从stdin读密码,安全性不如从终端读取。
适配不同语言的提示
如果你的sudo提示不是英文(比如包含其他语言的"密码"关键词),只需要修改awk的匹配规则就行,比如匹配包含本地语言的密码关键词:
# 比如中文环境,匹配包含"密码"的行 ssh -t remote 'sudo echo bar' 2>&1 | awk '/密码/ {print > "/dev/stderr"; next} {print}' | tr bar foo
内容的提问来源于stack exchange,提问作者Richard Smith
相关产品推荐
相关产品推荐

