ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]

Posted

技术标签:

【中文标题】ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]【英文标题】:ssh command execution doesn't consider .bashrc | .bash_login | .ssh/rc? [duplicate] 【发布时间】:2010-11-14 23:08:56 【问题描述】:

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

ssh <user>@<host> <command>

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

alias ll='ls -al'

那么到底应该执行以下命令:

ssh user@host "ll"

我已经发现 .bashrc 只能通过交互式 shell 获取,所以我在 .bash_login 中输入:

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

我还尝试直接在 .bash_login 中定义别名。

我还尝试将 .bashrc 的别名定义/来源放在 .bash_profile 和 .ssh/rc 中。但这些都不起作用。 请注意,我无法更改调用 ssh 命令的方式,因为这是某些二进制安装脚本的一部分。我唯一可以修改的是环境。执行 ssh 命令时是否还有其他可能获取此别名的来源?是否有一些 ssh 配置需要调整?

【问题讨论】:

这些文件(.bashrc 等)在哪台机器上?您要 ssh-ing 到的机器,还是要从中 ssh-ing 的机器? 文件在我 ssh 到的机器上 我也已经为我的用户检查了 /etc/passwd。它定义了 /usr/bin/bash。 你试过.bash_profile吗?这就是.bashrc 在我的机器中的来源。 是的,我也试过 .bash_profile 和 .profile 也没有用。 【参考方案1】:

来自 bash 的手册页:

当 shell 不是交互式时,别名不会展开,除非使用 shopt 设置了 expand_aliases shell 选项

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

shopt -s expand_aliases

【讨论】:

我支持你,但你应该解释它的作用。 正如这里其他地方所解释的,shell 不处于交互模式。这启用了扩展别名的选项。来自文档:如果设置,别名将按照上面 ALIASES 下的描述进行扩展。默认情况下,交互式 shell 启用此选项。 是的,我找到了,我只是建议您将其添加到您的评论中。我尝试在ssh $HOST 'shopt -s expand_aliases; ll' 中执行该命令,但没有奏效。放在.bashrc里应该可以,但我没试过。 哦,好的。如果您不想更改目标机器上的环境,您可以尝试其他几件事:ssh user@host "bash -ic ll" 通过“交互式”运行命令为我工作,并且手册页还讨论了设置 shopt 选项一个 -O 标志来 bash。 @bradlis7 您的尝试失败,因为 bash 在读取该行时会扩展别名(这是在执行“shopt -s expand_aliases”之前)。详情请见this answer。【参考方案2】:

代替:

ssh user@host "bash -c ll"

尝试:

ssh user@host "bash -ic ll"

强制 bash 使用“交互式 shell”。

【讨论】:

对我来说,我必须使用ssh user@host "bash -lc ll"——一个 l 而不是 i。 (利马而不是印度。) 我尝试了-ic,效果很好!谢谢! 但是,这是否意味着我必须在 SSH 调用中添加每个别名?我指的是 "ssh user@host "bash -ic ll"" 的 "ll" 部分【参考方案3】:

编辑:

正如here 所指出的,关于非交互式 shell..


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

现在,对于 bashrc 文件中的每个别名,都说我有:


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

为 ll 创建一个以该别名命名的文件:

user@host$ vi ssh_aliases/ll #inside ll,write ls -l user@host$ chmod a+x ll

现在编辑 .bashrc 以包含:


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

这可以完成工作.. 虽然我不确定这是否是最好的方法EDIT(2) 您只需要对别名执行此操作,bashrc 中的其他命令将按照 David 所指出的那样执行“您必须具有可执行文件才能 ssh 运行命令”。

【讨论】:

感谢您的建议。安装脚本调用的别名是在安装目录中某个位置的自定义 bashrc 中定义的,在该自定义 bashrc 中,除了别名之外,还定义了许多导出变量。因此,使用您的解决方案,我需要为每个别名/导出创建一个文件? 我刚试过,可惜还是不行。我不确定,但调用 ssh 时似乎没有获取 .bashrc。 在“# If not running interactive, don't do anything”行之前尝试一些 echo 语句,并调用第一个表单命令行,如:ssh user@machine 以测试它是否有效。虽然它可以在我的机器上运行 @sud03r 它对你有用吗?我试过了但没有成功。你确定你已经接受了CORRECT 的回答吗? @stanleyxu2005 这背后的想法是为远程计算机上的每个别名创建一个二进制文件,然后使用 ssh 远程运行它。我在这里看到的唯一问题是您正在编辑的 .bashrc 没有来源,并且该命令无法执行。在这种情况下,您必须找出适当的 .bashrc(正确的用户)并对其进行编辑。【参考方案4】:

在所有脚本中都可见的别名的替代方法是 导出 & 执行变量

# 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_commands 并编辑 /etc/bash.bashrc

很有用

source /path/to/my_commands

【讨论】:

这不能回答问题。【参考方案5】:

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

source = $HOME/.bashrc

退出您的 ssh 并再次登录,您应该可以让 .bashrc 设置为您工作。

【讨论】:

这应该是source $HOME/.bashrc. $HOME/.bashrc

以上是关于ssh 命令执行不考虑 .bashrc | .bash_login | .ssh/rc? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

配置开机自启命令文件~/.bashrc/etc/profile/etc/bash.bashrc的异同(bashrc:Bash Run Commands)

BASH 和/或 .BASHRC 在 SU 或 SSH 登录后无法正常工作,除非运行“bash”命令

ssh语法高亮

通过ssh远程查看java版本与在客户端查看不一致

centos bash.bashrc空白了怎么办

ssh中将常用的命令做别名