su 옵션-다른 사용자로 명령 실행


75

스크립트에서 다른 사용자로 명령을 실행하는 방법이 궁금합니다.

스크립트 소유자가 루트로 설정되어 있습니다. 또한 hudson 사용자로 명령을 실행하기 위해 스크립트 내에서 다음 명령을 실행하고 있습니다.

su -c command hudson

이것이 올바른 구문입니까?


다른 Google 직원의 경우 : 일부 사용자는이 기능을 일부러 비활성화했을 수 있습니다. 당신은 실행할 수 있습니다 sudo cat /etc/passwd | grep user-abc. 이 같은 것을 보면 user-abc:x:994:994::/home/user-abc:/bin/false작동하지 않습니다. 마지막 부분 " /bin/false"은 해당 사용자에 대한 쉘이 없음을 의미하기 때문입니다.
Alexander Bird

답변:


78

예. 여기에 --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

그리고 일부 테스트 ( 계정 sudo의 비밀번호를 모르는 데 사용 했습니다 nobody)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

명령이 인수를 취할 때 인용해야합니다. 그렇지 않으면 이상한 일이 발생합니다. 여기서 전체 명령 인용 하지 않고 / home / oli (oli로)에 디렉토리를 만들려고합니다 .

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

플래그 mkdir의 값으로 만 읽히고 사용자 이름 -c으로 사용하려고합니다 /home/oli/java. 인용하면 작동합니다.

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -

52

참고 : "스크립트 소유자를 루트로 설정했습니다"는 아무 것도하지 않습니다. setuid 비트가 설정되어 있어도 여전히 작동하지 않습니다


그러나 실제로 스크립트를 루트로 실행한다고 가정하면을 사용할 수 있습니다 sudo. su주로 사용자 전환을위한 것이며 sudo다른 사용자로서 명령을 실행하기위한 것입니다. -u플래그는 명령을 같이 실행하는 사용자 지정할 수 있습니다 :

sudo -u hudson command

1
여러 번 (sudoers가 잘 관리되는 시스템에서) 사용하려고 sudo하면 이것을 얻을 수 있습니다 root is not in the sudoers file. 어떤 수 su - <username> -c "command to run"있는 유일한 옵션을 선택합니다.
RAM237

사소한 명령을 실행할 때는 따옴표가 필요하지 않습니다. (예, sudo -u kilgore mv this that)
toraritte
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.