내 기본 원격 셸이 문제를 일으키나요?

내 기본 원격 셸이 문제를 일으키나요?

finger tim서버에 있으면서 내 기본 셸이 다음과 같은 스크립트라는 것을 알게 되었습니다 /usr/local/bin/bash-wrapper.

#!/bin/bash

USERNAME=`whoami`

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
   echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
   echo -e "User authorized"
   /bin/bash
else #in case users are trying to send a command via ssh or use scp
   $2
fi

이제 나는 그 대본이 내가 그랬던 이유라는 것을 이해합니다.ssh로 로그인시 쫓겨남. 최근에 검색 중인 파일 /etc/domain-users에 추가했기 때문에 문제는 이제 사라졌습니다 grep.

이제 내 질문은 다음과 같습니다.

  1. ssh아래 두 질문 중 2부와 3부에서와 동일한 줄에서 서버 셸을 실행하도록 하는 명령을 보내면 스크립트는 어떻게 됩니까 ?

  2. 이것이 이유입니까?내 공개 키 사본이 실패했습니다.:

    $ cat /home/tim/.ssh/id_rsa.pub | ssh tim@server 'cat >> .ssh/authorized_keys'
    Password: 
    cat: >>: No such file or directory
    cat: .ssh/authorized_keys: No such file or directory
    

    나도 시도했지만 ssh-copy-id그것도 작동하지 않습니다.

    $ ssh-copy-id tim@server
    Password: 
    /usr/local/bin/bash-wrapper: line 11: umask: 077;: octal number out of range
    
  3. 다음 ssh-tunneling 명령도 내 로컬 컴퓨터에서 제대로 실행되지 않습니다.

    ssh -f -D 9999 tim@server "if [ -f ~/.tunnel ]; then rm ~/.tunnel; fi; while [ ! -f ~/.tunnel ]; do echo > /dev/null; done"
    

    이것은 내가 얻는 오류입니다

    /usr/local/bin/bash-wrapper: line 11: if: command not found
    

    이유를 알고 싶습니다.

  4. 로그인 속도가 항상 느립니다. grep시간이 걸리기 때문일까요 ? 검색 /etc/domain-users중인 파일 에는 grep199줄이 있으며 각 줄은 사용자 이름입니다. grep작업을 완료 하는 데 오랜 시간이 걸리나요 ?

  5. 기본 쉘을 어떻게 변경합니까?

감사드립니다!

답변1

200줄 파일을 탐색하는 데는 몇 밀리초 정도 걸릴 것이므로 의심스럽습니다.

ssh -vvv tim@server무엇이 당신의 속도를 늦추는지 살펴보세요 .

기본 셸은 /etc/passwd다음 줄 끝에 저장됩니다.

drjimbob:x:1000:1000:jim bob,,,:/home/drjimbob:/bin/bash

chsh tim -s /bin/bash(쉘 변경)을 통해 변경할 수 있습니다. 일반적으로 기본 쉘을 변경하려면 루트 권한이 있어야 하지만 사용자 비밀번호가 있으면 이 작업을 수행할 수 있습니다(루트 권한은 필요하지 않음).

이것은 /usr/bin/ssh-copy-id단지 스크립트일 뿐이며 문제를 일으키는 줄은 다음과 같습니다.

{ eval "$GET_ID" ; } | ssh ${1%:} "umask 077; test -d .ssh || mkdir .ssh ; cat >> .ssh/authorized_keys" || exit 1

이것을 테스트하는 경우 test_script.sh와 같은 스크립트를 사용하십시오.

#!/bin/bash

umask 077; echo "Works fine"
$2

그리고 이렇게 실행해 보세요bash -v -x test_script.sh "ignored_first_parameter" "umask 077; echo 'no'"

$IFS두 번째 인수에 변수 "umask 077; echo no"의 bash 토큰화(환경 변수 기반)가 표시되고 , 쉘 확장은 bash에게 umask '077;'오류를 발생시킨 명령을 실행하도록 지시합니다.

이는 기본적으로 bash를 입력하는 것이 변수를 설정 하고 실행하는 것과 command1; command2동일하기 때문입니다 .some_var='command1; command2"$some_var

바라보다:http://www.gnu.org/software/bash/manual/bashref.html


편집: 특정 질문을 해결하려면;

(1) 나는 여전히 이 액세스 제어 방법이 의심스럽고 사용자에게 다른 유형의 액세스 권한이 있는 경우 표준 트릭 중 하나로 우회될 수 있다고 생각합니다. 사용자 디렉터리에 대한 ftp 액세스 권한이 있다고 가정하면 .login 파일(가짜 $PATH 및 가짜 whoami 포함)을 업로드하여 로그인할 수 있습니다.

최소한 스크립트는 전체 경로를 지정해야 합니다 whoami(내 우분투 시스템에서는 /usr/bin/whoami시스템마다 다를 수 있습니다). 바라보다:Linux 보안 프로그래밍 5.2장.

로그인할 수 없는 사용자에 대해서는 셸을 비활성화하는 것이 더 깔끔해 보입니다(예를 들어 /bin/false목록에 없는 사용자에 대해 셸을 in으로 설정). /etc/passwd대안으로(또는 추가로) 원격 로그인만 걱정되는 경우 ssh에 대한 사용자/그룹 화이트리스트 또는 블랙리스트 사용자/그룹 /etc/ssh/sshd_config의 조합을 사용하는 설정이 있습니다 (그러나 물리적 연결이 있는 경우 이러한 사용자는 로그인할 수 있습니다). ) 기계에 액세스하려면).AllowUsers/AllowGroupsDenyUsers/DenyGroups

그러나 감독자가 eval $2이를 사용하기 위해 스크립트를 수정하면 ssh-copy-id 관련 문제가 즉시 해결되어야 합니다. 바라보다Bash: 변수 확장과 함께 eval을 사용하는 이유.

#!/bin/bash

USERNAME=`whoami`

if ! grep ^$USERNAME$ /etc/domain-users > /dev/null; then
 echo -e "You are not authorized to log into this server\n\n"
elif test -z "$2"; then
 echo -e "User authorized"
 /bin/bash
else #in case users are trying to send a command via ssh or use scp
 eval $2
fi

질문 2-5의 경우: (2) 예, (3) 예, (4) 아니요, (5) chsh tim -s /bin/bash.

관련 정보