私の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_command
some_command
非対話型セッションで実行されるため、bash
リモートデータを読み取ることはできません~/.bashrc
(もちろん、ローカルデータを読み取ることもできません)。
正確に言えば、非対話型セッションは環境変数または(設定されている場合)定義bash
されたファイルを読み取ることができます。BASH_ENV
ENV
エイリアスを引き続き使用するには、対話モードでシェルを開くこともできます。
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
それは問題を解決しました