명령에 sudo su를 사용하십니까?


15

지난 밤에 커맨드 라인 기술을 개발하는 중이었고 sudo를 사용할 때 'permission denied'라는 오류 메시지가 표시되는 문제가 발생했습니다. 그러나 'sudo su'를 사용하고 루트가되면 명령이 작동했습니다.

첫 번째 인스턴스에서 sudo가 작동하지 않은 이유는 무엇입니까?

그것은 :

$ sudo cat > /var/www/info. php
<?php
phpinfo( ) ;
? >
^D

LAMP 서버 설정 섹션의 Linux Bible 2010 버전


예제를 제공하지 않으면 문제를 해결하기가 어렵습니다.
LassePoulsen

1
sudo -s이상 고려하십시오 sudo su.
Jeremy L

답변:


18

<,> 및 >>는 명령의 입력 / 출력 리디렉션에 사용됩니다.이 기능은 셸에서 제공하는 기능입니다 (예 : bash). 따라서 입력과 같은 명령 sudo cat > /var/www/info.php을 입력하면 파일을 열려고합니다./var/www/info.php 해당 파일을 표준 출력으로 sudo명령에 제공합니다. sudo를 발동을 것을이 쉘에 의해 처리되기 때문에 출력이 콘솔로 이동하거나 파일로 재 지정 여부를 명령도 인식하지 못합니다.

명령을 입력 한 쉘이 로그인 쉘이거나 사용자 ID가있는 터미널에서 실행중인 다른 쉘인 경우, 루트가 아닌 사용자 ID와 동일한 권한을 갖습니다.

따라서 귀하의 경우 cat 명령은 루트로 실행되지만 출력을 복사 /var/www/info.php하는 것은 정상적인 사용자로 실행되는 쉘에 의해 시도되며, 예상대로 실패합니다.

이러한 상황에 대한 해결 방법은 다음 tee명령 을 사용하는 것입니다 .

sudo tee /var/www/info.php

이것은 콘솔에 입력 된 모든 텍스트를 ^ D까지 매개 변수로 지정된 파일에 넣는 의도 된 효과를 갖습니다.

바람직하지 않은 부작용 중 하나 tee는 출력을 stdout으로 반향하므로 각 줄을 입력하고 Enter 키를 누르면 tee사본이 다시 출력됩니다. 이를 피하기 위해 다음 변형을 사용할 수 있습니다.

sudo tee /var/www/info.php > /dev/null

터미널에서 자세한 정보를 얻을 tee수 있습니다 info tee.


2

다음과 같이 파일 쓰기 권한이 필요한 명령에는 sudo가 작동하지 않습니다.

sudo echo "vm.swappines = 100" >> /etc/sysctl.conf

sudo 맨 페이지에 설명되어 있습니다.


4
루트 프롬프트를 얻기 위해 "sudo -i"또는 "sudo -s"를 언급하면이 답변이 더 나아질 것입니다!
Jorge Castro

예제 명령에는 파이프가 없습니다. 리디렉션이 있습니다. 또한 "때로는 작동하지 않습니다"는에 의해 비정상적인 동작을 전달하는 것으로 보입니다 sudo. koushik의 답변에서 알 수 있듯이, 동작은 유닉스 권한 모델에 대해 상당히 예측 가능하고 일관되며 "정확합니다".
msw

2

문제는 "> foo.txt"부분이 sudo 명령이 실행되기 오래 전에 명령 인터프리터 (쉘)에 의해 해석되고 실행된다는 것 입니다. sudo 명령은 출력을 파일로 경로 재 지정하려는 것을 모릅니다.

명령 인터프리터는 루트 권한이 없지만 sudo 명령은 나중에 나중에 출력을 foo.txt로 경로 재 지정할 수 없습니다.


1

이를 해결하는 또 다른 방법은 sudo로 서브 쉘을 시작하고 해당 서브 쉘에서 해당 명령을 실행하는 것입니다.

$ sudo bash -c "cat > /var/www/info.php"
<?php
phpinfo( ) ;
? >
^D

여기에서 "sudo"가있는 명령은 bash이며이 명령에서 실행 된 모든 항목에는 루트 권한이 있습니다.

$ 2c, * 파이크

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.