Bash 别名无法通过 ssh 工作

Bash 别名无法通过 ssh 工作

我的 Bash 别名无法通过 ssh 运行,例如:

$ ssh remote_name ll dir_name
bash: ll: command not found

Bash 手册页显示:

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

所以我在本地和远程文件的文件shopt -s expand_aliases顶部添加了(因为我不确定需要哪个 - 远程对吧??)。~/.bashrc.bashrc

我重新启动本地 Bash 并ssh remote_name ll dir_name再次尝试,不幸的是我仍然遇到同样的错误bash: ll: command not found

谁能解释一下我应该做什么才能让它正常工作?

以防万一我的 Bash 版本是:

Local Bash:
$ bash --version 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

Remote Bash:
$ bash --version 
GNU bash, version 4.3.30(1)-release (x86_64-pc-linux-gnu)

答案1

~/.bashrc由 的非登录交互式会话读取bash,而不是由非交互式会话读取。

ssh remote some_commandsome_command在 的非交互式会话中运行bash,因此不会读取远程数据~/.bashrc(当然读取本地数据也是不可能的)。

准确地说,非交互式会话可以读取环境变量或(如果设置)bash定义的文件。BASH_ENVENV

如果您想坚持使用别名,也可以以交互模式打开 shell:

ssh remote bash -ic 'll'

另请注意,别名是独立的,它们不接受任何参数,就像您提供目录名称一样。您需要使用函数将参数作为输入。类似的函数定义是:

ll_f () { ls -al --color=auto "$@" ;}

现在你可以这样做:

ll_f /dir_name

答案2

我最喜欢的方式(在~/.bashrc):

function bassh() {
    local host=${1:?'arg #1 missing: remote host'}
    shift
    local command="$@"
    local usage="bassh REMOTE_HOST COMMAND"

    [ "$command" ] || {
        echo -e >&2 "[error] no command provided\nUsage: ${usage}"
        return 1
    }

    ssh ${host} -t bash -ic "'${command}'"
}

请注意-tssh 的选项,该选项强制伪终端分配,从而避免相关警告。

然后你简单地称呼它:

$ bassh REMOTE_HOST ll

答案3

使用

 #!/bin/bash -l

它解决了问题

相关内容