paramiko SSHClient接続でaliasコマンドを使用する方法は?

paramiko SSHClient接続でaliasコマンドを使用する方法は?

「py3start」または「py3test」エイリアスコマンドを識別できずに、次のコマンドを実行しようとしています。 (使用前にエイリアスを明示的に設定したことを確認するために、テスト目的で「py3test」を導入しました。):

command = "echo $SHELL; py3start; alias py3test='source ~/.venv/python3/bin/activate'; py3test"
stdout, stderr, status = connection.exec_command(command=command, timeout=timeout)

以下の出力を参照してください。 デバッグセッションで取得したコマンド標準出力です。

使用されているシェルが/bin/bashで、エイリアスが~/.bashrcファイルと~/.bash_profileファイルに次のように定義されていて、「alias -p」の出力が次のようになってもエイリアスが認識されない理由が調べるのを手伝ってください。同じパラミコセッションに合格しました。上記のエイリアスが含まれています(最後のスクリーンショットを参照)。

これは、ターゲットVM上の~/.bashrcファイルと~/.bash_profileファイルの内容です。ここではエイリアスpy3startを設定しました。

[root@VM ~]# cat ~/.bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias py3start='source ~/.venv/python3/bin/activate'


# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
[root@VM ~]# cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

alias py3start='source ~/.venv/python3/bin/activate'

# User specific environment and startup programs

PATH=$PATH:$HOME/bin

export PATH

[root@VM ~]#

コマンドに「alias -p」が含まれている場合は、以下の出力を参照してください。ここで別名を見つけましたが、使用しようとするとまだ見つかりません。

command = "echo $SHELL; py3start; alias py3test='source ~/.venv/python3/bin/activate'; alias -p; py3test"
stdout, stderr, status = connection.exec_command(command=command, timeout=timeout)


stderr = {str} 'bash: py3start: command not found\nbash: py3test: command not found\n'

標準出力: デバッグセッションで取得したコマンド標準出力です。

答え1

少なくとも2つの問題があります。引用するman bash

シェルが非対話型の場合、Shoptを使用してExpand_aliasesシェルオプションを設定しない限り、エイリアスは拡張されません。

Bash は、その行または複合コマンドからコマンドを実行する前に、入力の完全な 1 行と複合コマンドを構成するすべての行を常に読み込みます。エイリアスは、コマンドの実行時ではなく、コマンドの読み込み時に拡張されます。したがって、他のコマンドと同じ行に表示されるエイリアス定義は、次の入力行を読むまで適用されません。

だから両方が必要です。

shopt -s expand_aliases

次の改行文字alias py3test=...

関連情報