我有一台别名如下的服务器:
~/.bash_aliases
alias update='sudo apt update && sudo apt -y upgrade'
现在我想从我的桌面创建一个快捷方式,可以通过 sshpass 远程触发此脚本:对于简单的登录,它的工作方式如下:
sshpass -p "<password>" ssh <user>@<host>
但是将别名添加为 ssh 命令不起作用,只是关闭终端而不采取任何操作:
sshpass -p "<password>" ssh <user>@<host> 'update'
问题:这可能吗?
答案1
在我的第一个示例中,我通过将 bash 会话转换为交互式 shell 来简化操作,从而设置 shopt_option expand_aliases
。还有一个案例陈述在 .bashrc 的开头禁止采购.bashrc 在非交互式 shell 中,这意味着你的 .bash_aliases 将不会被来源。此外,即使ssh
将其解释为非交互式会话,您也可以使用该-t
选项强制为菜单和基于屏幕的应用程序分配伪终端以使其运行。
ssh -t user@localhost '/bin/bash -ic update'
它可以在非交互式shell,但 apt 仍然需要一个伪终端(可以通过更改使用的前端来解决易于非交互式选择)。
ssh -t user@localhost '/bin/bash --init-file ~/.bash_aliases -O expand_aliases -c update'
-p
接下来是sshpass 中似乎不会消失的密码的使用。sshpass
永远都不应该以这种方式使用。我看不出需要这样做的情况。首先,它会最终出现在您的 中history
,也就是说,当然,您没有关闭它。在某些情况下,它也可能最终出现在 ps 树中。sshpass 在这种模式下几乎不能隐藏密码。您至少应该使用文件选项或SSHPASS=
。
editor .ssh/passwd_credentials && chmod 400 $_
passwd_credentials 应该只包含密码。
并由选项使用-f
。
sshpass -f ~/.ssh/passwd_credentials ssh user@localhost
您也可以将ssh
命令封装在脚本文件中。
#!/bin/sh
SSHPASS='password' sshpass -e ssh user@localhost
答案2
使用sshpass
不会触发服务器加载别名,但您可以传递如下命令:
sshpass -p <password> ssh <user>@<host> sudo /usr/bin/apt update && sudo /usr/bin/apt -y upgrade
然而...您将收到如下消息:
sudo: a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper
这意味着你需要做一个非常让系统按照你的意愿做丑陋的事情:
sshpass -p <password> ssh <user>@<host> echo <password> | sudo /usr/bin/apt update && echo <password> | sudo /usr/bin/apt -y upgrade
这种方法由于多种原因并不是最理想的,但它将技术上实现您的目标。根据您想要实现的目标,考虑使用unattended-upgrades
其他方法可能会更有意义。