"bash: !/bin/su": 이벤트를 찾을 수 없습니다"

"bash: !/bin/su": 이벤트를 찾을 수 없습니다"

내 스크립트에 작동하는 줄이 있지만 명령줄에서 실행할 수 없습니다.

echo "User ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers



[user@localhost ~]$ echo "test ALL = NOPASSWD: ALL, !/bin/su" | sudo tee -a /etc/sudoers
bash: !/bin/su": event not found
[user@localhost ~]$

편집: 명령 권한 없이 sudo 사용자를 추가하려고 하는데 susudo 사용자가 사용 가능합니다 sudo -i. 방금 해당 스크립트의 모든 명령을 확인하여 명령줄에서 어떻게 작동하는지 확인했습니다.

사용해야 하는 해결 방법을 명령줄에서 찾았습니다 "'!'"/bin/su. 이것이 명령줄에서 작동하지 않는 이유를 설명해 줄 수 있는 사람이 있습니까?

답변1

[당신이 올바른 방식으로 일을 하고 있지 않은 것 같으니 당신의 질문과 관련된 댓글을 주의 깊게 읽어 보십시오 sudo.]

에는 bash명령줄에서 활성화할 수 있는 "기록 교체"라는 메커니즘이 있습니다. 이를 통해 이전 명령의 전체 또는 일부를 편집 중인 명령(따라서 "history"라는 이름)에 삽입할 수 있습니다.

기록 교체를 트리거하는 문자는 입니다 !. 예를 들어 !WORD로 시작하는 마지막 명령으로 바꿉니다 WORD. 그러한 명령이 없으면 bash다음과 같은 오류 메시지가 표시됩니다 bash: !WORD: event not found.

!기록 대체 메커니즘을 활성화하지 않고 a를 입력 해야 하는 경우 이스케이프 처리 \!하거나 작은따옴표로 묶어야 합니다 '!'.

예를 들어:echo 'User ALL = NOPASSWD: ALL, !/bin/su' | ...

기록 확장이 번거롭다면 를 사용하여 비활성화하고 set +H따옴표 없이 명령을 입력한 !다음 나중에 를 사용하여 다시 활성화할 수도 있습니다 set -H.

답변2

  1. su루트에는 특별한 권한이 부여되지 않습니다. 따라서 루트 액세스 권한을 가진 사람들이 이를 사용하는 것을 막는 것은 의미가 없습니다.
  2. 원본 파일 sudo을 확장 visudo하고 .sudo/etc/sudoers.d/
  3. 이스케이프해야 합니다 !. "bla bla bla \! bla bla"그렇지 않으면 'bla bla bla ! bla bla'작은따옴표가 중지됩니다.모두문자열 평가.

답변3

sudo나는 이것이 권한이 있는 사용자가 su명령을 실행하는 것을 방지하는 데 도움이 되지 않을 것이라고 생각합니다. sudo권한이 있는 모든 사용자는 자신의 기본 디렉터리에서 복사한 다음 이를 실행할 수 있기 때문입니다. 항상 그렇듯이 사용자에게 전체 권한을 부여한 다음 명령을 실행하는 것을 막을 su수는 없습니다. sudo특정한 일을 하는 것은 하나님께서 항상 제한 사항을 피할 방법을 찾아주실 것이기 때문에 당신은 그 반대의 일을 하고 그에게 몇 가지 특권을 주어야 합니다.

관련 정보