以不同的用户身份运行一个shell脚本

以不同的用户身份运行shell脚本的好方法是什么? 我正在使用Debian刻蚀,我知道我想模拟哪个用户。

如果我手动做,我会做:

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

由于我想自动化这个过程,所以我需要一种方法来运行backup_db.sh作为postgres(inheritance环境等)

谢谢!

要将脚本作为另一个用户运行为一个命令,请运行:

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

我build议在这样的脚本中始终使用完整path – 当你su的时候,你不能总是保证你会在正确的目录下(也许有人改变了你的homedir,谁知道)。 我也总是使用su(/ bin / su)的完整path,因为我是偏执狂。 可能有人可以编辑你的path,并导致你使用su的受损版本。

如果要运行的目标用户定义了nologin shelll,那么可以使用-s选项来指定shell:

 /bin/su -s /bin/bash -c '/path/to/your/script' testuser 

请参阅以下问题: 以具有nologinshell的用户身份运行脚本

如果您想按计划自动执行此操作,则可以将其放入用户的反汇编程序中。 虽然Cron作业不能获得完整的环境,但是将脚本本身所需的所有envvariables放在一起可能会更好。

编辑用户的crontab:

 sudo crontab -u postgres -e 

这应该是一个有用的shell脚本读取setuid

如果使用“ - username ”参数序列运行su ,它将为用户创build一个loginshell,以便为用户提供相同的环境。 通常,用于从不同的login名快速执行您的家庭环境的脚本。

尝试su手册:

su -c script_run_as_postgres.sh – postgres

更重要的是,你可以使用sudo来让你运行那个没有密码的postgres。 不过,在/ etc / sudoers中需要一些设置。

别人发布的“su -c …”方法是一个不错的方法。 对于自动化,您可以将脚本添加到您需要执行的用户的crontab中。

如果用户已经有一个sudo入口,并且你不知道超级用户的密码,那么你可以尝试下面这个:这个重新启动postgres在/data/my-db/pgsql/9.6/data初始化

 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" 

你也可以使用:

sudo -u postgres script_run_as_postgres.sh