以不同的用户身份运行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