내 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
그것은 문제를 해결했다