특정 명령과 함께 su를 사용하는 올바른 방법은 무엇입니까?

특정 명령과 함께 su를 사용하는 올바른 방법은 무엇입니까?

필요할 때 나는 항상 다음과 같은 일을 합니다.

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'

하지만 나는 이전에 이런 일을 해본 적이 없기 때문에 이것에 대해 매우 혼란스럽습니다.

가장 중요한 것은 내 질문은 다음과 같습니다.

  1. su도중에 순서가 바뀌었나요?
  2. 내가 계속 잘못 불렀는데 이전 버전이 더 관대했습니까?
  3. 명령을 전달하는 공식적으로 올바른 방법은 무엇입니까?

(최신 버전은 util-linux 2.33.1에서 나온 것으로, 나에게는 매우 까다로워 보입니다.)

[PS 이 질문 은 구체적 으로 su. ]sudosudo

답변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

관련 정보