다른 사용자로 쉘 스크립트를 실행하십시오.


42

쉘 스크립트를 다른 사용자로 실행하는 좋은 방법은 무엇입니까? 데비안 에칭을 사용하고 있는데 가장 할 사용자를 알고 있습니다.

수동으로 수행했다면 다음과 같이하십시오.

su postgres
./backup_db.sh /tmp/test
exit

프로세스를 자동화하고 싶기 때문에 backup_db.sh를 postgres로 실행하는 방법이 필요합니다 (환경 상속 등).

감사!

답변:


67

하나의 명령으로 다른 사용자로 스크립트를 실행하려면 다음을 실행하십시오.

/bin/su -c "/path/to/backup_db.sh /tmp/test" - postgres

Breaking it down:
 /bin/su : switch user
 -c "/path/to..." : command to run
 - : option to su, make it a login session (source profile for the user)
 postgres : user to become

나는 항상 이와 같은 스크립트에서 전체 경로를 사용하는 것이 좋습니다. su를 할 때 항상 올바른 디렉토리에 있다고 보장 할 수는 없습니다 (아는 사람이 당신의 homedir을 변경했을 수도 있습니다). 나는 또한 편집증이기 때문에 항상 su (/ bin / su)의 전체 경로를 사용합니다. 누군가가 경로를 편집하여 손상된 su 버전을 사용하게 할 수 있습니다.


항상 암호를 입력해야합니까? 그것을 어떻게 얻을 수 있습니까?
zjffdu

2
루트가 아닌 사용자로 명령을 실행하는 경우 항상 비밀번호를 입력해야합니다. 비밀번호를 피하려면 sudo가이를 허용하도록 구성 할 수 있습니다. 그러나 사용자가 su를 실행할 수 있도록 sudo를 구성하면 사용자가 될 수 있습니다. 명령에 대한 스크립트를 작성하고 스크립트 권한을 700으로 설정하고 루트가 소유 한 다음 사용자가 단일 스크립트를 실행할 수 있도록 sudo를 구성하는 것이 좋습니다.
baumgart

나는이 답변이 OP에 효과적 일 수는 있지만 완전히 정확하지는 않다고 생각합니다. 내 지식으로는, -(또는 --login)를 함께 사용하면 --command, -c실제로 로그인 세션을 시작하지는 않습니다. 왜냐하면 -c항상 비 로그인 쉘을 강제 하기 때문 입니다.
JeanMertz

1
참고 : 이식성 - postgress을 위해 명령 끝에가 나타납니다. 매뉴얼 페이지에서 :When - is used, it must be specified before any username. For portability it is recommended to use it as last option, before any username. The other forms (-l and --login) do not have this restriction.
jonny


9

이를 일정에 따라 자동화하려면 사용자의 crontab에 넣을 수 있습니다. Cron 작업은 전체 환경을 얻지 못하지만 스크립트 환경에 필요한 모든 env 변수를 넣는 것이 좋습니다.

사용자의 crontab을 편집하려면

sudo crontab -u postgres -e

더 설명해 주시겠습니까?
saravanakumar

3

이 글은 유익한 정보 여야합니다- 쉘 스크립트의 setuid

" "인수 순서로 su 를 실행 - username하면 사용자에게 동일한 환경을 제공하는 로그인 쉘이 작성됩니다. 일반적으로 다른 로그인에서 홈 환경으로 스크립트를 빠르게 실행하는 데 사용됩니다.


일련의 작업을 수행해야하는 경우 유용 할 수 있습니다. 그러나 대부분의 시스템 서비스 계정에는 유효한 홈 경로와 셸이 없어야합니다.
Dan Carley

2

su 맨 페이지를 시도하십시오.

su -c script_run_as_postgres.sh-postgres

대체로, sudo를 사용하여 암호없이 postcoms로 해당 코만을 실행할 수 있습니다. 그래도 / etc / sudoers에 약간의 설정이 필요합니다.


2

다른 사람들이 게시 한 "su -c ..."방법은 좋은 방법입니다. 자동화를 위해 스크립트를 실행할 사용자의 crontab에 스크립트를 추가 할 수 있습니다.


1

사용자에게 이미 sudo에 대한 항목이 있고 수퍼 유저의 비밀번호를 모르는 경우 다음을 시도해보십시오. /data/my-db/pgsql/9.6/data에서 초기화 된 postgres를 다시 시작합니다.

sudo su - postgres -c "/usr/pgsql-9.6/bin/pg_ctl -D /data/my-db/pgsql/9.6/data -l /var/log/pgsql.log restart"

-1

다음을 사용할 수도 있습니다.

sudo -u postgres script_run_as_postgres.sh

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