当命令作为 SSH 命令的参数提供时,SSH 会使所有输入的密码可见

当命令作为 SSH 命令的参数提供时,SSH 会使所有输入的密码可见

如果我运行这个:

ssh user@server 'mysql -u user -p'

当它要求我输入 MySQL 密码时,我开始输入,密码显示在屏幕上。我该如何防止这种情况发生?如果我通过它登录ssh,然后执行 MySQL 命令,一切都会正常。

答案1

如果您提供要运行的远程命令,SSH 不会分配 tty,因此远程命令无法禁用 echo。您可以使用以下选项强制 SSH 提供 tty -t

ssh -t user@server 'mysql -u user -p'

等效选项(用于-o或用于配置文件)是RequestTTY。我建议不要在配置中使用它,因为它可能对非交互式命令产生不良影响

答案2

将密码存储在受保护的选项文件中

如果您可以信任[*]远程计算机的安全性,则可以将密码存储在适当保护的选项文件中,如最终用户密码安全指南章节,而无需ssh每次都进行交流或打字。

.my.cnf具体来说,您可以在主目录中的文件的 [client] 部分添加一行:

[client]
password=your_pass

当然,你必须通过将文件访问模式设置为 400 或 600,以防止除你之外的任何人访问该文件,例如

chmod 600 ~/.my.cnf

然后你可以使用类似

ssh user@server 'mysql -u user110971 --defaults-file=/home/user110971/mysql-opts'

user110971您的帐户的用户名在哪里?


强制 ssh 分配一个伪 tty ( ssh -t)

每次您发送命令ssh并且需要插入输入时都会发生此问题,因为默认情况下ssh不会分配伪tty。

您可以使用选项强制分配 tty-t,(如果需要,可以设置多个):

-t

强制伪tty分配。 这可用于在远程机器上执行任意基于屏幕的程序,这非常有用,例如在实现菜单服务时。 多个-t选项强制分配 tty,即使 ssh 没有本地 tty。

正如你所读到的这篇 Debian 帖子(2008 年 7 月 11 日)关于sudo,这是一个喜欢重复出现的老问题:

ssh user@server "sudo ls"  
password: password  

密码已显示给您

解决方案是强制 ssh 分配一个伪 tty,使用 -t 标志:

ssh -t user@server sudo ls

笔记:

[*]如果你可以依赖将密码留在只有你和 root 可以访问的文件中,在职的客户端。
如果可以通过更改操作系统或移除硬盘来重新启动远程计算机,则该计算机不能被视为完全安全……但在这种情况下,数据库本身将不安全。

答案3

proc fs 的挂载选项“hidepid”也很有用。它使你的命令行在其他用户的进程列表中不可见。fstab 示例:

proc /proc proc hidepid=1 0 0

相关内容