필요할 때 나는 항상 다음과 같은 일을 합니다.
su root cmd args
cmd
루트로 실행하십시오 args
. 매뉴얼 페이지에는 cmd
대상 계정의 쉘을 사용하고 귀하의 항목을 호출하는 방법이 나와 있습니다 -c
.
그러나 최신 컴퓨터 중 하나에서 그렇게 하면
su root date
그것은 불평한다
/usr/bin/date: /usr/bin/date: cannot execute binary file
나는 다음 -c
을 명시적으로 사용하여 이 문제를 해결할 수 있다는 것을 발견했습니다.
su root -c date
하지만 매개변수가 포함된 명령은 여전히 작동하지 않습니다. 내가 말하면
su root -c expr 1 + 2
expr
"피연산자 누락"에 대해 불평합니다 . 내가 해결할 수 있어저것함으로써
su root -c 'expr 1 + 2'
새버젼 su
인거 같은데아니요거기에 자신의 물건을 자동으로 던집니다 -c
.
어쩌면 항상 이렇게 하는 습관을 들여야 할지도 몰라
su root -c 'command args'
하지만 나는 이전에 이런 일을 해본 적이 없기 때문에 이것에 대해 매우 혼란스럽습니다.
가장 중요한 것은 내 질문은 다음과 같습니다.
su
도중에 순서가 바뀌었나요?- 내가 계속 잘못 불렀는데 이전 버전이 더 관대했습니까?
- 명령을 전달하는 공식적으로 올바른 방법은 무엇입니까?
(최신 버전은 util-linux 2.33.1에서 나온 것으로, 나에게는 매우 까다로워 보입니다.)
[PS 이 질문 은 구체적 으로 su
. ]sudo
sudo
답변1
Git 개정 내역을 살펴보면 알 수 있듯이 util-linux
이 유틸리티 su
의 변형에는 -c
명령이 쉘 스크립트가 아닌 한 실행할 명령을 전달하는 옵션이 항상 필요합니다.
명령이 사용자의 로그인 쉘용으로 작성된 쉘 스크립트인 경우 이는 필요하지 않습니다 -c
. 사용은 su root ./script
루트로 로그인하여 실행하는 것과 같습니다 (이렇게 하면 스크립트의 모든 줄을 $SHELL ./script
덮어씁니다 ).#!
스크립트가아니요루트 사용자의 로그인 셸용으로 작성된 이 스크립트는 su root -c ./script
루트로 로그인하여 실행하는 것과 동일합니다(스크립트의 -line을 따릅니다)../script
$SHELL -c ./script
#!
su
내가 아는 한, 이것은 Linux가 아닌 시스템에서도 작동하는 방식입니다.
다음은 약간의 접선입니다.
OpenBSD에서su(1)
수동, 예를 들어:
요약
su [-fKLlm] [-a auth-type] [-c login-class] [-s login-shell] [login [shell arguments]]
[...]
선택사항인 경우쉘 매개변수명령줄에 제공되면 대상 로그인의 로그인 셸로 전달됩니다. 이를 통해
-c
대부분의 쉘이 이해하는 옵션으로 임의의 명령을 전달할 수 있습니다. 일반적 으로-c
하나의 인수만 필요합니다. 여러 단어를 전달할 때는 이를 인용해야 합니다.
여기의 옵션 은 -c
에 대한 옵션이 아니라 호출 su
셸에 대한 옵션입니다. su
이 -c
옵션은 su
독립적이며 OpenBSD에서 완전히 다른 작업을 수행합니다. 둘 사이의 차이점은 명령줄에 표시되는 사용자 이름의 측면입니다.
OpenBSD는 사용자 이름 뒤의 인수를 루트 쉘에 전달하기 때문에 다음을 수행할 수 있습니다:
$ su root -x -c 'echo hello'
Password:
+ echo hello
hello
set -x
(즉, 셸에서 명령을 활성화하고 실행합니다)
GNU 명령줄 구문 분석은 약간 이상하기 때문에(옵션 순서를 변경함) Linux에서 정확히 동일한 방식으로 이를 수행하는 것은 불가능하며 대신 다음을 사용하여 --
옵션 구문 분석을 중지해야 합니다.
$ su root -x -c 'echo hello'
su: invalid option -- 'x'
Try 'su --help' for more information.
( su
해석 -c
하고 -x
자신의 선택으로)
% su root -- -x -c 'echo hello'
Password:
+ echo hello
hello
( 및 루트 사용자의 쉘에 su
전달 )-c
-x
답변2
su
더 이상 사용되지 않으며 이전 버전과의 호환성을 위해서만 존재합니다.
새로운 작업 방식:
sudo command arg1 arg2 ...
루트로 명령을 실행하십시오.sudo -u someone command arg1 arg2 ...
실행 명령은someone
sudo -i
뿌리가 되십시오.(이 방법을 사용하는 사람들을 자주 볼 수 있습니다sudo su
. 이 방법도 작동하지만 환경 설정 시 문제가 발생하거나su
앞으로 더 이상 작동하지 않을 수 있습니다.)sudo -u someone -i
누군가가 되십시오.
su
루트 비밀번호가 필요한 경우에는 sudo
자신의 비밀번호를 사용하세요.
이는 보안 문제처럼 보일 수 있지만 실제로는 더 나은 보안을 제공합니다. 전체 내용은 설명서를 참조하세요.
시스템에서 이미 사용할 수 있을 가능성이 높습니다 sudo
. 그렇지 않은 경우 설치하고 사용자가 다음 sudo
그룹 에 있는지 확인하세요./etc/group