关于bash:ssh命令执行不考虑.bashrc | .bash_login | .ssh/rc?

ssh command execution doesn't consider .bashrc | .bash_login | .ssh/rc?

本问题已经有最佳答案,请猛点这里访问。

我正在尝试通过ssh远程执行命令,例如:

1
ssh <user>@<host> <command>

需要执行的命令是一个别名,它在.bashrc中定义,例如

1
alias ll='ls -al'

因此,最后应该执行以下命令:

1
ssh user@host"ll"

我已经发现了这一点。bashrc只能通过交互式shell获得源代码,所以在.bash_login中我输入:

1
2
3
if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

我还尝试在.bash_登录中直接定义别名。

我还尝试将.bash rc的别名定义/源代码放在.bash_概要文件和.ssh/rc中。但这些都不起作用。注意,我无法更改如何调用ssh命令,因为这是一些二进制安装脚本的一部分。我唯一能修改的就是环境。在执行ssh命令时,是否还有其他可能获得这个别名的来源?是否有一些ssh配置需要修改?


从bash的手册页:

Aliases are not expanded when the shell is not interactive, unless the expand_aliases shell option is set using shopt

有几种方法可以做到这一点,但最简单的方法是将以下行添加到您的.bashrc文件中:

1
shopt -s expand_aliases


而不是:

1
ssh user@host"bash -c ll"

尝试:

1
ssh user@host"bash -ic ll"

强制bash使用"交互式shell"。


编辑:

正如这里所指出的,关于非交互式外壳。

1
2
3
 # If not running interactively, don't do anything
[ -z"$PS1" ] && return
 # execution returns after this line

现在,对于您的bashrc文件中的每个别名,假设我有:

1
2
alias ll="ls -l"
alias cls="clear;ls"

创建一个以该别名命名的文件,对ll说:

1
2
3
4
user@host$ vi ssh_aliases/ll
<wyn>#inside ll,write
ls -l</wyn>
user@host$ chmod a+x ll

现在编辑.bashrc包括:

1
2
 # If not running interactively, don't do anything
[ -z"$PS1" ] && export $PATH=$PATH:~/ssh_aliases

这就是工作。尽管我不确定这是不是最好的方法编辑(2)
您只需要对别名执行此操作,bashrc中的其他命令将按照david所指出的那样执行,"您必须有可执行文件才能让ssh运行命令"。


在所有脚本中都可见的别名的另一种选择是导出和执行变量

1
2
# shortcut to set enviroment to insensitive case
export go_I="shopt -s nocasematch"

现在在任何脚本中都可以使用

#!/bin/bash
$go_I # go Insensitive
[[ a == A ]] # evaluates TRUE ( $? == 0)
$go_C # maibe want to go back to casesensitive

在/path/to/my_命令和edit/etc/bash.bashrc中放置所有快捷方式/别名非常有用。

source /path/to/my_commands


打开文件~/.bash_profile。如果此文件不存在,请在主目录中创建一个并添加下面的行

来源=$home/.bashrc

退出ssh并登录agian,您应该可以使用.bashrc设置。