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

~/.bashrcbash非対話型セッションではなく、非ログインの対話型セッションとして読み込みます。

ssh remote some_commandsome_command非対話型セッションで実行されるため、bashリモートデータを読み取ることはできません~/.bashrc(もちろん、ローカルデータを読み取ることもできません)。

正確に言えば、非対話型セッションは環境変数または(設定されている場合)定義bashされたファイルを読み取ることができます。BASH_ENVENV

エイリアスを引き続き使用するには、対話モードでシェルを開くこともできます。

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}'"
}

-t関連する警告を避けるために疑似端末割り当てを強制するsshオプションに注意してください。

その後、単に呼び出します。

$ bassh REMOTE_HOST ll

答え3

使用

 #!/bin/bash -l

それは問題を解決しました

関連情報