在ssh中使用类似bash的命令replace或者如何从ssh * client *请求数据

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')" 

这将执行在SSH客户端上,而不是在服务器上的cat passfile 。 有什么知道吗? 你有什么其他的技巧怎么做?

更新:我感谢我的例子的答案,但我不会接受他们,除非他们回答真正的问题。 也就是说,可以从ssh会话中与ssh客户端计算机通信。 (我知道这可能构成一个可能的安全问题)

可能的解决scheme:

  • 有一个SSH客户端连接回服务器。 (sweimann)问题是如何获取连接回服务器的证书。
  • 使用ssh创build隧道并使用一些netcat脚本/ telnet在服务器上执行命令并将结果发送回去。
  • 使用expect来编写shell脚本。 (Zac Thompson)
  • 在客户端的ssh上使用一个自定义的包装,看着控制台并采取相应的行动。 (札幌)
  • 修补SSH来支持这个。 邮件列表上有相似的补丁。
  • 有一个选项“SendEnv” ssh在远程计算机上设置环境variables。 不过,这个必须在远程sshd上启用。

你想用这个期望 。 它可能已经在你的机器上了。 这是任何types的交互式命令行自动化的标准工具。 这是一个Tcl库,所以你可以免费得到一些Tcl技巧。 谨防; 这是令人上瘾的。

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

尝试使用<。

ssh [email protected]“mysql -u blub -p”<文件

如果“文件”中的第一行是你的密码,那么“应该”使用密码提示符,其余部分将用于sql部分。

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

ssh [email protected]“mysql -u blub -p <file.sql”<密码

几年前我一直在研究潜在的问题。 我想从SSH会话中触发SCP下载。 就像您的问题一样,这需要从SSH会话内返回到客户端上的某个进程。

因此,下面是第三种可能的解决scheme:使用SSH协议进行连接,扫描SSH的输出并在识别模式时在本地触发某些命令。 这显然是一个黑客,但它可能会伎俩。

我结束了一个/ usr / bin /脚本的修改版本,它会记住我的SSH连接(例如me@somehost ),并且每当我的ssh会话打印时, ###/some/absulte/path/to/file/on/host.txt### ,它会在本地执行scp me@somehost:/some/absulte/path/to/file/on/host.txt .

一个简单的shell脚本被用来方便地在服务器上产生模式和绝对path。

(我的代码实际上做得更多一些:它在下载的文件上打开了一个本地文本编辑器,并在修改文件时使用SCP重新上传,让我知道是否需要代码。

我一直在寻找这个更好的实现,但迄今为止还没有find。

也许这个技术可以被实现为一个SSH代理命令(思考connect.c)而不是SSH的包装器。

对于这个特定的问题,也许你可以把密码放在服务器上的〜/ my.cnf文件中?

对于你的想法:你必须使用逃避做这个工作:

 ssh dba@db "echo \`ssh [email protected] \"cat echofile\" \`" 

再次编辑:您将需要从服务器到客户端的无密码login,这意味着服务器上的客户端的私钥,比my.cnf更安全。

你必须模拟terminal会话:

 ssh -t [email protected] "mysql -u blub -p" 

在这种情况下,您将被要求通过encryption的ssh-channel访问networking的密码,并且不会在控制台中显示。

你需要先执行一个shell,类似于

 ssh [email protected] bash -c 'mysql -u user -p$(cat /root/pass_file)' 

你使用ssh而不是telnet但仍然通过命令发送密码,在远程机器上以明文forms自由执行(在ps列表中可见)。

请仔细阅读这篇有关保护MySQL的SecurityFocus文章 。

好吧,我想我可以肯定地说,你想做的事不是一般的可能,只有解决方法是依赖于你想解决的实际问题。

考虑一下,我会解决你的“示例问题”,只需通过ssh从客户端到服务器进行端口转发,然后使用本地mysql客户端与本地my.cnf,实际上是我总是用mysql工作。

你可以在你的本地机器上使用环境variables。 如果你的本地机器上有人可以看到你的环境,它会打开安全漏洞。 并且服务器上的任何人都可以看到密码。

 PASSWORD=$(cat pass-file) ssh [email protected] "mysql -u blub -p$PASSWORD" 

我想通过使用单引号,环境variables的值将从远程机器获取。 所以你可以在远程机器的.bashrc中设置PASSWORD = value。 然后在你的本地机器上运行ssh [email protected]'。 的〜/ .bashrc; mysql -u blub -p $ PASSWORD'

安装sshpass(yum install)

sshpass -p密码ssh [email protected]

如果你不想担心指纹按键添加

sshpass -p password ssh -o StrictHostKeyChecking = no [email protected]

您可以让bash将这个参数解释为一个命令,并在通过SSH发送之前加载您的密码

 MY_PASSWORD=abcde ssh [email protected] `echo mysql -p$MY_PASSWORD`