쉘 리디렉션

쉘 리디렉션

와 같은 명령을 실행하면 cd실행 이 "중단"되는 명령이 있습니다 .llsudo

sudo앞에 명령이 있을 때 어떤 명령이 이런 방식으로 "중단"되는지 아는 경험적 법칙은 무엇입니까?

이 데이터는 나와 다른 초보자가 보다 안정적인 스크립트를 작성하는 데 도움이 됩니다.

답변1

오직외부 명령를 통해 실행할 수 있습니다 sudo.

스도

sudo이 프로그램은 슈퍼유저(또는 이 옵션을 사용하는 경우 다른 사용자)의 유효 권한으로 외부 명령을 실행하기 위해 새 프로세스를 포크(시작)합니다 . -u즉, 셸 내부의 명령은 지정할 수 없습니다. 여기에는 셸 키워드, 내장 명령, 별칭 및 함수가 포함됩니다.

명령을 외부 명령(셸 내부 명령이 아닌)으로 사용할 수 있는지 확인하는 가장 좋은 방법은 를 실행하는 것입니다. type -a command_name그러면 지정된 실행 파일이 포함된 모든 위치가 표시됩니다.

예 1: 쉘 내장

이 경우 cd명령은 쉘 내장으로만 사용할 수 있습니다.

$ type -a cd
cd is a shell builtin

다음을 사용하여 실행하려고 하면 sudo:

$ sudo cd /
sudo: cd: command not found

예 2: 별칭

이 경우 ls명령은 외부 명령이지만 동일한 이름의 별칭도 사용자 셸에 생성됩니다.

$ type -a ls
ls is aliased to `ls -F --color'
ls is /bin/ls

를 실행하려면 sudo ls수퍼유저로 실행되는 별칭이 아닙니다. 해당 -F옵션을 원하면 명시적으로 옵션으로 포함해야 합니다 sudo ls -F.

예제 3: 셸 내장 명령 및 외부 명령

이 경우 pwd명령은 셸 내장 및 외부 명령으로 사용할 수 있습니다.

$ type -a pwd
pwd is a shell builtin
pwd is /bin/pwd

이 경우 외부 /bin/pwd명령이 실행됩니다 sudo.

$ sudo pwd
/home/anthony

일반적으로 쉘 내장 및 외부 명령으로 제공되는 명령의 다른 예로는 kill, test( [) 및 가 있습니다 echo.

sudo를 사용하여 내부 쉘 명령 실행

슈퍼유저 권한으로 내장 셸을 실행하려면 외부 명령으로 셸을 시작해야 합니다. 예를 들어 다음 명령은 bash수퍼유저로 실행되며 cd명령줄 옵션으로 제공된 내장 명령을 사용합니다.

$ sudo bash -c "cd /; ls"
bin   etc   lib  media  mnt  ntp.peers  proc  sbin     share  sys
tmp  var boot  dev  home  lost+found  misc   net  opt … …

참고: 별칭은 -c해당 옵션과 함께 Bash에 명령으로 전달될 수 없습니다.

쉘 리디렉션

주목해야 할 또 다른 문제는 현재 쉘의 컨텍스트 내에서 쉘 리디렉션이 발생한다는 것입니다. 실행하려고 하면 sudo /bin/echo abc > /test.file작동하지 않습니다. 알겠어요 -bash: /test.file: Permission denied. echo 명령은 수퍼유저 권한으로 실행되지만 출력은 현재(권한이 없는) 셸에 인쇄되며 일반 사용자로서 해당 /디렉터리 에 쓸 수 있는 권한이 없습니다 .

이 문제를 해결하는 한 가지 방법은 다음 sudo을 사용하여 새 셸을 시작하는 것입니다(위의 예와 유사).

sudo bash -c "echo abc > /test.file"

/이 경우 출력 리디렉션은 권한 있는 셸(쓰기 권한이 있는 셸 ) 의 컨텍스트에서 발생합니다 .

tee또 다른 해결책은 슈퍼유저로 명령을 실행하는 것입니다.

echo abc | sudo tee /test.file

답변2

cd또는 ll프로그램이 아니지만 실제로는 셸에 내장된 명령입니다. 다음 명령을 사용하면 사용 가능한 모든 내장 명령을 볼 수 있습니다.

복합 유전자-b

sudo이러한 모든 명령에 사용할 수는 없습니다.

답변3

ll별칭이므로 sudo와 함께 사용할 수 없습니다. sudo를 사용하면 대화형 셸을 얻을 수 없기 때문에 별칭은 sudo에서 작동하지 않습니다(특별히 요청하지 않는 한).

cdsudo 권한 없이 디렉터리로 변경하는 것은 의미가 없기 때문에 상황이 다릅니다.

제안을 따르세요많은내장 명령은 sudo에서 작동하지 않지만 다른 명령은 작동합니다. 특히 자신과 다른 사용자가 시작한 프로세스를 종료하려면 kill실행해야 합니다 .sudo kill <pid>

관련 정보