ssh 中的类似 Bash 的命令替换或如何从 ssh *客户端* 请求内容?

ssh 中的类似 Bash 的命令替换或如何从 ssh *客户端* 请求内容?

在 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 服务器可以重新连接。(sweimann) 问题是如何获取重新连接服务器的凭据。
  • 使用 ssh 创建隧道并使用一些 netcat 脚本/telnet 在服务器上执行命令并返回结果。
  • 使用 expect 来编写 shell 脚本。(Zac Thompson)
  • 在客户端上使用自定义包装器来观察控制台并采取相应的措施。(札幌)
  • 修补 SSH 以支持此功能。邮件列表中有类似的补丁可用的
  • 有一个选项“SendEnv”远程控制设置远程计算机上的环境变量。不过,必须在远程 sshd 上启用此功能。

答案1

你想使用预计为此。它可能已经安装在您的机器上了。它是​​任何类型的交互式命令行自动化的标准工具。它是一个 Tcl 库,因此您将免费获得一些 Tcl 技能。注意;它很容易上瘾。

#!/path/to/expect
spawn ssh [email protected] "mysql -u blub"
expect "*ssword:*"
send -- "mypass\r"
interact

答案2

尝试使用<。

远程控制[电子邮件保护]“mysql -u blub -p”< 文件

如果“文件”中的第一行是您的密码,则“应该”将其用作密码提示,然后其余部分将用于 sql 部分。

如果您只是在远程服务器上执行 SQL 文件,请尝试:

远程控制[电子邮件保护]“mysql -u blub -p < 文件.sql”< 密码

答案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 通道在网络上传输的密码,并且该密码不会显示在控制台中。

相关内容