【问题标题】:How to not echo here document to terminal?如何不将此处的文档回显到终端?
【发布时间】:2013-06-30 01:08:31
【问题描述】:

我有一个脚本提示用户输入他们的 sudo 密码,然后遍历主机列表并在远程主机上执行命令。我可以“读取 -s”以静默获取他们的密码,但每次在远程主机上使用他们的密码时,它都会回显到终端。在本地主机上更改 stty 没有帮助。示例:

#!/bin/sh -x

echo "Enter sudo pass:"
read -s SUDOPASS

stty_orig=$(stty -g)
stty -echo
ssh -tt remote_host sudo cat /etc/cma.conf <<EOP
$SUDOPASS
EOP
stty $stty_orig

输出仍然包含密码:

+ ssh -tt remote_host sudo cat /etc/cma.conf
My_P4ssW0rd!
Password:
<?xml version="1.0" encoding="UTF-8"?>
...

在远程主机上玩 stty 也无济于事:

stty_orig=$(ssh -t remote_host stty -g)
ssh -t remote_host stty -echo
ssh -tt remote_host sudo cat /etc/cma.conf <<EOP
$SUDOPASS
EOP
ssh -t remote_host stty $stty_orig

FWIW,我主要关心 OSX bash/sh

【问题讨论】:

  • 您应该使用IFS= read -rs SUDOPASS,以防密码中有空格和反斜杠。

标签: bash ssh heredoc stty


【解决方案1】:

试试expect:

#!/bin/sh

echo "Enter sudo pass:"
read -s SUDOPASS

expect -c 'spawn ssh -tt remote_host sudo cat /etc/cma.conf ; expect -re "\\\[sudo\\\] password for .*:"; send "'"$SUDOPASS"'\n";interact'

【讨论】:

  • 呃,不……你自己试试吧。 '-x' 在那里让我跟随。我可以在不启用调试的情况下重现该问题。
  • 哦,对不起...我读错了。我以为您没有在屏幕上打印ssh 密码。这是sudo 密码,这就是问题所在。更新答案。
【解决方案2】:

说实话,我还没有发现这里的问题。但我经常手动重定向输出以使其静音:

ssh -tt remote_host sudo cat /etc/cma.conf <<EOP >& /dev/null

我不确定这是否会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-15
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    相关资源
    最近更新 更多