sudo로 경로 재 지정 또는 파이핑을 포함하는 명령을 실행하는 방법은 무엇입니까?


60

루트 계정 대신 sudo를 사용하는 모범 사례라고 가정합니다.

다음과 같은 간단한 concat 파일 작업을 실행 중입니다.

sudo echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

일반 사용자로 실행중인 ">>"오른쪽에 실패합니다. 추가 sudos 추가도 실패합니다 (파일이 아닌 sudo 명령으로 파이핑 한 후 예상되는 동작).

예는 그저 루트 계정으로 확인 및 테스트되었습니다.

답변:


75

새로운 쉘을 루트로 호출 할 수 있습니다 :

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

파일에 쓰는 프로세스를 향상시킬 수도 있습니다.

sudo tee -a /etc/conf.d/hwclock > /dev/null << EOF
clock_hctosys="YES"
EOF

8
일반적으로 두 번째 옵션은 tee복잡하고 오해하기 쉬운 기본 명령이 아닌 명령 만 루트로 실행 하기 때문에 더 안전 합니다. (의 경우는 echo아님)
pabouk

19

마찬가지로 안전한 또 다른 옵션은 sudo-i스위치를 사용 하여 루트로 로그인하는 것입니다.

$ sudo -i
# echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

루트 계정이 실제로 활성화되어 있지는 않지만 루트로 안전하게 작업 할 수 있기 때문에 여전히 모범 사례 규칙을 따릅니다. 보낸 사람 man sudo:

The -i (simulate initial login) option runs the shell
    specified by the password database entry of the target user
    as a login shell.  This means that login-specific resource
    files such as .profile or .login will be read by the shell.
    If a command is specified, it is passed to the shell for
    execution via the shell's -c option.  If no command is
    specified, an interactive shell is executed. 

또 다른 대안은 다음과 같습니다.sudo bash
starbeamrainbowlabs

11

작은 따옴표없이 명령을 표현하면 작은 따옴표 안에 넣고 중간 쉘을 통해 실행할 수 있습니다.

이것을 루트로 실행하려면 :

echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

사용하지 않는 다른 방법으로 명령을 작성하십시오 '.

echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock

그런 다음 다음을 호출하십시오 sudo sh -c ….

sudo sh -c 'echo clock_hctosys=\"YES\" >> /etc/conf.d/hwclock'

또는 루트 만 쓸 수있는 파일에 출력을 쓰려면을 호출하십시오 sudo tee. 패스 -a하는 옵션 tee대상 파일에 추가 할, 그렇지 않으면 파일이 잘립니다합니다.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

더 복잡한 파일 수정의 경우 호출 할 수 있습니다 sudo sed, sudo ed, sudo perl, ...

또는 괜찮은 편집기를 사용하여 sudo라고 부릅니다. Emacs에서을 엽니 다 /sudo:/etc/conf.d/hwclock. Vim에서 호출 :w !sudo tee %하여 열린 파일에 루트로 쓰거나 sudo.vim 플러그인을 사용하십시오 . 또는 sudo 끝에서 전화를 겁니다 sudoedit /etc/conf.d/hwclock.

또는 어두운면에 굴려서 껍질을 루트로 실행할 수 있습니다.

$ sudo -i
# echo 'clock_hctosys="YES"' >> /etc/conf.d/hwclock

5

리디렉션 된 파일에 대한 권한으로 인해 명령이 실패합니다. sudo명령이 호출 되기 전에도 리디렉션이 발생합니다 .

실제로 쓰기 위해 파일을 여는 것이 루트인지 확인해야합니다.

가장 간단한 방법은 다음과 같습니다.

echo 'clock_hctosys="YES"' | sudo tee -a /etc/conf.d/hwclock >/dev/null

echo그냥 텍스트 문자열을 생산으로 일반 사용자 사용자로 실행 할 수있다. 이 tee유틸리티는 루트로 실행해야하며 tee -a데이터를 추가합니다. 기본적으로 표시된 파일에 쓰는 것 외에도 입력 데이터를 표준 출력에 복제 하기 /dev/null때문에 출력을 리디렉션 tee합니다.

bash또는 "여기-문자열을"이해하고 어떤 쉘 :

sudo tee -a /etc/conf.d/hwclock >/dev/null <<<'clock_hctosys="YES"'

위와 동일합니다. 문자열을 생성하는 방식 만 변경됩니다.


또 다른 약간 우회하는 방법 :

sudo sh -c 'echo clock_hctosys=\"YES\" >>/etc/conf.d/hwclock'

여기서 리디렉션 sh -c은 루트로 실행 되는 자식 셸 내에서 발생 합니다.


4

sudo dd of=

원하는대로 추가하려면 :

echo inbytes | sudo dd of=outfile oflag=append conv=notrunc

또는 처음부터 파일을 다시 작성하려면 다음을 수행하십시오.

echo inbytes | sudo dd of=outfile

장점 :

  • 리디렉션 이 tee없기 때문에/dev/null
  • sh서브 쉘 이 없기 때문에
  • ddstatus=progress전송 진행 상황을 볼 수있는 많은 강력한 옵션이 있습니다.

sudo가 stdin을 명령으로 전달하기 때문에 작동합니다.

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