우리 팀은 수천 대의 Linux/Unix 시스템을 담당하므로 루트 계정은 자연스럽게 관리자 간에 "공유"됩니다. 나는 vi 모드를 선호하고 다른 사람들은 emacs 모드를 선호합니다.
다른 모든 사람도 vi 모드를 사용하도록 강요하지 않고 SSH를 통해 컴퓨터에 로그인할 때 bash의 readline을 vi 모드로 설정하려면 어떻게 해야 합니까?
set -o vi
본질적으로 매번 실제로 입력하지 않고 다른 사람에게 그렇게 하도록 강요하지 않고 로그인 후 효과를 원합니다 (Emacs 모드가 나에게 짜증나는 것처럼 vi 모드도 그들에게 짜증납니다).
모든 사람이 자신의 계정과 sudo를 사용하여 권한 있는 명령을 실행한다면 문제가 되지 않을 것이라는 것을 알고 있지만, 제가 통제할 수 없는 상황으로 인해 안타깝게도 이는 선택 사항이 아닙니다.
답변1
나는 갈 것이다:
ssh server -t "bash --login -o vi"
하지만 관리자라면 더 깔끔한 방법을 시도해 볼 수 있습니다. 예를 들어, SendEnv
클라이언트 측에서 ssh 옵션을 사용하여 특정 변수를 전송하고, 구성(서버 측) AcceptEnv
에서 이를 사용 sshd
하여 이를 수락하고, 이를 기반으로 루트 .bashrc
파일을 수정하여 변수 값에 따라 동작을 조정할 수 있습니다. .
이는 sshd
모든 호스트와 그 호스트를 변경하는 것을 의미합니다 .bashrc
. 그러나 이는 정확히 "독립형" 접근 방식이 아닙니다.
답변2
이것은 어리석은 접근 방식이며 실제로는 공개 키 인증에만 작동합니다.
먼저 로컬 컴퓨터에 nc
이 프로그램이 설치되어 있는지 확인하세요.
둘째, 여전히 로컬 컴퓨터에서 스크립트를 만들고(이렇게 부르겠습니다 ) 알고 있는 곳에 connect-to-server
두세요 *:${PATH}
#!/bin/sh
# connect-to-server
ssh -q server-hostname "touch .yourname" </dev/null >/dev/null 2>&1
nc server-hostname 22
다음으로 .bashrc
어딘가에 포함되도록 원격 시스템을 수정합니다.
# partial .bashrc
if [ -f "${HOME}/.yourname" ]; then
rm "${HOME}/.yourname"
set -o vi
fi
마지막으로 로컬 컴퓨터로 돌아가서 편집하여 다음을 ~/.ssh/config
추가합니다.
# partial ssh config
Host serverNickname
Hostname server-hostname
ProxyCommand connect-to-server
이 접근 방식의 단점(그리고 내가 이것을 바보라고 부르는 이유):
- 실제 프록시 명령이 필요한 경우에는 더 복잡해집니다.
- 다른 사람이 귀하와 동시에 로그인한 경우
.yourname
파일이 아직 삭제되지 않았을 수 있으며, 이 경우 해당 파일set -o vi
도 삭제됩니다. - 결론은 이렇게 하면
ssh serverNickname command
실행command
되지만 (.bashrc
소스를 가져오지 않기 때문에).yourname
파일은 여전히 존재하므로 SSH 구성에서 의사 프록시를 사용하지 않는 두 번째 별칭을 사용하는 것이 예의입니다. .
사실은,오직이 접근 방식의 장점은 ssh
명령이 추가 매개변수를 제공할 필요가 없다는 것입니다.
*원격 시스템에서 아무것도 변경하지 않으려면 다른 의사 프록시를 사용하여 임시 프록시를 만들 수 있습니다 .bashrc
.
#!/bin/sh
# connect-to-server
ssh -q server-hostname 'ln .bashrc .bashrc.real; cat .bashrc.real <(printf "set -o vi; ln -f .bashrc.real .bashrc\n") >.bashrc.yourname; ln -f .bashrc.yourname .bashrc' </dev/null >/dev/null 2>&1
nc server-hostname 22
ssh
이는 다른 방법과 동일한 단점이 있으므로 의사 프록시를 호출하지 않는 구성에서 두 번째 별칭을 사용해야 합니다 .
답변3
간단한 클라이언트 솔루션의 경우:
alias connect='ssh -t root@server "bash -o vi"'
루트의 쉘 초기화 스크립트가 명시적으로 를 사용하거나 로 set -o emacs
설정 하거나 루트의 파일이 키 바인딩을 호출하는 경우 이 작업은 실패합니다 .EDITOR
emacs
.initrc
emacs
이 답변의 나머지 부분은 서버 측 솔루션을 다룹니다.
ssh
기계에 들어가면 다음을 사용 하십시오 sudo -i
.
당신을 위한 /root/.bashrc
:
if [[ -n "$SUDO_USER" ]] && [[ -f /root/.bashrc-"$SUDO_USER" ]]; then
source /root/.bashrc-"$SUDO_USER"
fi
bashrc
이를 통해 .in 이라는 개인 파일을 가질 수 있으며 /root/.bashrc-patrick
, 예를 들어 원하는 것은 무엇이든 할 수 있습니다 set -o vi
.
이것을 기반으로 rc 파일을 선택하는 다소 순진한 접근 방식과 결합하십시오 $SSH_CLIENT
.
if [[ -n "$SUDO_USER" ]]; then
person="$SUDO_USER"
elif [[ -n "$SSH_CLIENT" ]]; then
case "$SSH_CLIENT" in
192.168.216.100*) person="joe" ;;
192.168.216.120*) person="patrick" ;;
192.168.216.150*) person="lindsey" ;;
esac
fi
if [[ -n "$person" ]] && [[ -f /root/.bashrc-"$person" ]]; then
source /root/.bashrc-"$person"
fi
분명히 이것은 항상 동일한 IP 주소에서 연결하는 경우에만 작동합니다.
또 다른 방법은 사용 중인 특정 SSH 키에 대한 설명 필드를 사용하는 것입니다. 이는 SSH 에이전트를 서버에 전달하는 경우 작동합니다.
ssh_comment="$( ssh-add -L | grep -f /root/.ssh/authorized_keys | awk '{ print $NF '} | head -n 1 )"
그러면 서버에 연결하는 데 사용하는 키에 대한 설명 필드가 선택됩니다. 파일 head -n 1
에 여러 개의 키가 있는 경우 이 버튼을 사용할 수 있습니다 authorized_keys
.
$ssh_comment
그런 다음 위의 방법 (경로 이름인 경우 $SUDO_USER
주석을 삭제해야 할 수도 있음)을 사용하거나 이 방법과 같은 명령문을 통해 소스로 원하는 rc 파일을 직접 선택할 수 있습니다 .$ssh_comment
case
$SSH_CLIENT