在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:
你想用这个期望 。 它可能已经在你的机器上了。 这是任何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`