我已经创建了一个如下所示的 shell 脚本。我需要隐藏密码,当脚本提示时我会给出密码。如果我在本地机器的单引号内运行以下脚本,它将隐藏密码。但如果我添加 SSH 部分,它不会。
我应该怎么做才能隐藏密码?
ssh root@10.3.2.0 'echo -n Password:; read -s password; echo; echo $password; '
我已经创建了一个如下所示的 shell 脚本。我需要隐藏密码,当脚本提示时我会给出密码。如果我在本地机器的单引号内运行以下脚本,它将隐藏密码。但如果我添加 SSH 部分,它不会。
我应该怎么做才能隐藏密码?
ssh root@10.3.2.0 'echo -n Password:; read -s password; echo; echo $password; '
尝试使用-t
ssh 选项来强制分配 tty。
ssh -t root@10.3.2.0 'echo -n Password:;
read -s password;
echo;
echo $password;'
编辑:建议解决方案的解释
如果不运行登录会话而只是一个命令,默认情况下 SSH 不会为正在运行的进程分配伪终端设备。这种行为并不是一个错误,而是故意选择的。
这样就可以在不同机器之间传递未经解释的二进制数据。也许是这样的:
ssh whoever@wherever 'cat remote_file' | local_program
如果数据被中间的终端驱动程序过滤,那么以这种方式在两台机器之间传递数据几乎是不可能的——想想你必须关心的大量转义序列!
如果没有分配任何终端,就无法隐藏用户输入。任何尝试都stty something
将失败,因为根本没有任何终端!
要让 ssh 分配一个伪终端,即使没有在登录会话中运行,您也必须传递-t
参数来强制分配 tty。
最好使用 ssh 密钥,这样,无需借助ssh-agent
. 查看一个很好的方法:https ://wiki.archlinux.org/index.php/SSH_Keys
I am new to scripts, though I guess this might can help you :
#!/bin/sh
echo -n "Enter Password : "
stty -echo
read password < /dev/tty
stty echo
echo
echo -n "Enter Password again : "
stty -echo
read password1 < /dev/tty
stty echo
echo
echo "Password Entered are : $password and $password1"