在 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 客户端计算机进行通信。(我知道这可能构成潜在的安全问题)
可能的解决方案:
答案1
你想使用预计为此。它可能已经安装在您的机器上了。它是任何类型的交互式命令行自动化的标准工具。它是一个 Tcl 库,因此您将免费获得一些 Tcl 技能。注意;它很容易上瘾。
#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact
答案2
答案3
几年前,我一直在研究这个潜在的问题。我想从 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 的包装器。
答案4
您必须模拟终端会话:
ssh -t [email protected] "mysql -u blub -p"
在这种情况下,您将被要求输入通过加密的 ssh 通道在网络上传输的密码,并且该密码不会显示在控制台中。