我可以在bash脚本中运行'su'吗?

时间:2010-08-06 00:56:47

标签: bash shell

我可以在脚本中间更改/ su用户吗?

if [ "$user" == "" ]; then
  echo "Enter the table name";
  read user
fi

gunzip *
chown postgres *
su postgres 
dropdb $user
psql -c "create database $user with encoding 'unicode';" -U dbname template1
psql -d $user -f *.sql

6 个答案:

答案 0 :(得分:46)

你可以,但bash不会以postgres的形式运行后续命令。相反,做:

su postgres -c 'dropdb $user'

-c标志以用户身份运行命令(请参阅man su)。

答案 1 :(得分:22)

您可以使用here document在脚本中嵌入多个su命令:

if [ "$user" == "" ]; then
  echo "Enter the table name";
  read user
fi

gunzip *
chown postgres *
su postgres <<EOSU
dropdb $user
psql -c "create database $user with encoding 'unicode';" -U dbname template1
psql -d $user -f *.sql
EOSU

答案 2 :(得分:11)

不喜欢这样。 su将调用一个默认为shell的进程。在命令行中,此shell将是交互式的,因此您可以输入命令。在脚本的上下文中,shell将立即结束(因为它无关)。

使用

su user -c command

command将以user执行 - 如果su成功,通常只有无密码用户或以root身份运行脚本的情况。

使用sudo获得更好,更细粒度的方法。

答案 3 :(得分:4)

不,你不能。或者至少......你可以su,但su只会在那个时候打开一个新的shell,当它完成时它会继续使用脚本的其余部分。

一种方法是使用su -c 'some command'

答案 4 :(得分:2)

我今天听到的另一个有趣的想法是,当您以root用户身份运行并希望以另一个用户身份运行脚本时,对脚本执行递归调用。请参阅以下示例:

我将脚本“my_script”作为“root”运行,并希望脚本以“raamee”用户身份运行


#!/bin/bash

#Script name is: my_script

user=`whoami`

if [ "$user" == "root" ]; then
  # As suggested by glenn jackman. Since I don't have anything to run once 
  # switching the user, I can modify the next line to: 
  # exec sudo -u raamee my_script and reuse the same process
  sudo -u raamee my_script
fi

if [ "$user" == "raamee" ]; then
  #put here the commands you want to perform
  do_command_1
  do_command_2
  do_command_3
fi

答案 5 :(得分:1)

参考以下问题的答案,

您可以在&lt;&lt;之间写作答案中提到的EOF和EOF。

_Atomic long long

How do I use su to execute the rest of the bash script as that user?