![su 옵션 - 다른 사용자로 명령 실행](https://linux55.com/image/419/su%20%EC%98%B5%EC%85%98%20-%20%EB%8B%A4%EB%A5%B8%20%EC%82%AC%EC%9A%A9%EC%9E%90%EB%A1%9C%20%EB%AA%85%EB%A0%B9%20%EC%8B%A4%ED%96%89.png)
스크립트 내에서 다른 사용자로 명령을 실행하는 방법을 알고 싶습니다.
스크립트 소유자를 루트로 설정했습니다. 또한 스크립트에서 다음 명령을 실행하여 hudson 사용자로 실행했습니다.
su -c command hudson
이것이 올바른 구문인가요?
답변1
예. 이것은 --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: -
답변2
참고: "스크립트 소유자를 루트로 설정했습니다"는 setuid 비트를 설정하더라도 아무 작업도 수행하지 않습니다.아니면
그러나 실제로 스크립트를 루트로 실행한다고 가정하면 주로 사용자를 전환하고 다른 사용자로 명령을 실행하는 데 sudo
. 이 플래그를 사용하면 명령을 실행하는 사용자를 지정할 수 있습니다.su
sudo
-u
sudo -u hudson command