以其他用户身份运行Shell脚本


42

以其他用户身份运行Shell脚本的好方法是什么。我正在使用Debian蚀刻,并且我知道我想模拟哪个用户。

如果我手动进行操作,则可以执行以下操作:

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

由于我想自动化该过程,因此我需要一种将backup_db.sh作为postgres运行的方法(继承环境等)。

谢谢!

Answers:


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 2012年

2
如果您以非root用户身份运行命令,则始终需要输入密码。如果您想避免使用密码,可以将sudo配置为允许该密码。但是-将sudo配置为允许用户运行su可以使他们成为任何用户。我建议为您的命令创建一个脚本,将脚本权限设置为700,并由root拥有,然后配置sudo以允许用户运行该脚本。
鲍姆加特2012年

我相信-尽管此答案可能适用于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's

3

这应该是内容丰富的读物- 有关shell脚本的setuid

如果使用“ ”参数序列运行su- username,它将为用户提供一个登录shell,使其具有与用户相同的环境。通常,用于通过其他登录名在家庭环境中快速执行脚本。


如果您需要执行一系列操作,这将很有用。但是请记住,大多数系统服务帐户不应具有有效的主路径和外壳程序。
丹·卡利

2

尝试su联机帮助页:

su -c script_run_as_postgres.sh-postgres

另外,您可以使用sudo来允许您仅将该逗号作为postgres运行,而无需输入密码。不过,它需要在/ 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

您还可以使用:

须藤-u postgres script_run_as_postgres.sh

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.