如何通过 sshpass/ssh 触发别名?

如何通过 sshpass/ssh 触发别名?

我有一台别名如下的服务器:

~/.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其他方法可能会更有意义。

相关内容