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'의 출력이 다음과 같음에도 불구하고 별칭이 인식되지 않는 이유를 누군가가 알아내도록 도와주세요. 동일한 paramiko 세션을 통과했습니다. 위의 별칭이 포함되어 있습니다(마지막 스크린샷 참조).

이는 대상 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

적어도 두 가지 문제가 있습니다. 인용하다 man bash:

셸이 비대화형인 경우 Shopt를 사용하여 Expand_aliases 셸 옵션을 설정하지 않으면 별칭이 확장되지 않습니다.

Bash는 해당 줄이나 복합 명령에서 명령을 실행하기 전에 항상 입력의 완전한 한 줄과 복합 명령을 구성하는 모든 줄을 읽습니다. 별칭은 명령이 실행될 때가 아니라 명령을 읽을 때 확장됩니다. 따라서 다른 명령과 같은 줄에 나타나는 별칭 정의는 다음 입력 줄을 읽을 때까지 적용되지 않습니다.

그래서 둘 다 필요해요

shopt -s expand_aliases

다음 개행 문자alias py3test=...

관련 정보