在 bash(和其他 shell)中,可以使用 $() 和 ``(反引号)之类的东西将命令的结果插入命令行。
现在,如果您有类似的东西,但对于 ssh 会话,那就太好了。因此,您处于 ssh 会话中,需要来自您自己计算机的一些信息,并希望将其放入您所连接计算机的内部命令行中。
例如说你想直接访问一个 mysql 控制台。你可以使用这样的命令:
ssh [email protected] "mysql -u blub -pmypass"
这行得通,但问题是,您可以在 ssh shell 进程的命令行中看到密码。
为了解决这个安全问题,我想要这样的东西:
ssh [email protected] "mysql -u blub -p\$(ssh-on-client 'cat pass-file')"
这将cat passfile
在 ssh 客户端而不是服务器上执行。有没有这样的已知情况?你还有其他技巧可以做到这一点吗?
更新:我很欣赏引用我的例子的答案,但除非他们回答真正的问题,否则我不会接受它们。也就是说,是否可以从 ssh 会话中与 ssh 客户端计算机进行通信。(我知道这可能构成安全问题)
可能的解决方案:
尝试使用 <。
ssh [email protected] "mysql -u blub -p" <文件
如果“文件”中的第一行是您的密码,它“应该”将其用于密码提示,那么其余的将用于 sql 部分。
如果您只是在远程服务器上执行一个 sql 文件,请尝试:
ssh [email protected] "mysql -u blub -p < file.sql" <密码
您想为此使用期望。它可能已经在您的机器上。它是任何类型的交互式命令行自动化的标准工具。这是一个 Tcl 库,因此您将在此过程中免费获得一些 Tcl 技能。谨防; 这很容易上瘾。
几年前我一直在研究潜在的问题。我想从 SSH 会话中触发 SCP 下载。像您的问题一样,这需要从 SSH 会话内部与客户端上的某个进程进行通信。
所以这是第三种可能的解决方案:使用 SSH 的包装器进行连接,它会扫描 SSH 的输出并在识别模式时在本地触发某些命令。这显然是一个黑客,但它可能会成功。
我最终得到了 /usr/bin/script 的修改版本,它会记住我的 SSH 连接(例如
me@somehost
),并且每当我的 ssh 会话打印###/some/absulte/path/to/file/on/host.txt###
时,它都会在本地执行scp me@somehost:/some/absulte/path/to/file/on/host.txt .
一个简单的 shell 脚本用于方便地在服务器上生成模式和绝对路径。
(我的代码实际上做了更多:它在下载的文件上打开了一个本地文本编辑器,并在文件被修改时使用 SCP 重新上传它。如果你想要代码,请告诉我。)
从那以后,我一直在寻找一个更好的实现,但到目前为止还没有找到。
也许这种技术可以实现为 SSH 代理命令(想想 connect.c),而不是 SSH 的包装器。
对于这个特定的问题,也许您可以将密码放在服务器上的~/my.cnf文件中?
出于您的想法:您必须使用转义才能使其工作:
再次编辑:您将需要从服务器到客户端的无密码登录,这意味着服务器上您的客户端框的私钥,这甚至比 my.cnf 更不安全。
您必须模拟终端会话:
在这种情况下,您将被要求输入通过加密的 ssh 通道在网络中传输的密码,并且不会显示在控制台中。
你需要先执行一个shell,比如
您使用
ssh
而不是telnet
但仍然通过命令发送密码,以便在远程计算机上以明文形式自由执行(在ps
列表中可见)。请通读这篇关于保护 MySQL 的 SecurityFocus 文章。
好的,我想我可以肯定地说你不想做的事情在一般情况下是不可能的,只有解决方法取决于你想要解决的实际问题。
再考虑一下,我将解决您给出的“示例问题”,只需通过 ssh 从客户端到服务器进行端口转发,然后使用带有本地 my.cnf 的本地 mysql 客户端,这实际上是我总是使用mysql的方式。
您可以在本地计算机上使用环境变量。如果您本地计算机上的某人可以看到您的环境,它将打开安全漏洞。服务器上的任何人都可以看到密码。
我认为通过使用单引号,环境变量的值将从远程机器中获取。因此,您可以在远程机器上的 .bashrc 中设置 PASSWORD=value。然后在您的本地机器上运行 ssh [email protected] '。~/.bashrc; mysql -u blub -p$PASSWORD'