можно запустить 'su' в середине скрипта bash? - PullRequest
31 голосов
/ 06 августа 2010

можно ли сменить / 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 ]

48 голосов
/ 06 августа 2010

Можно, но bash не будет запускать последующие команды как postgres. Вместо этого выполните:

su postgres -c 'dropdb $user'

Флаг -c запускает команду от имени пользователя (см. man su).

23 голосов
/ 13 декабря 2013

Вы можете использовать здесь документ для встраивания нескольких 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
11 голосов
/ 06 августа 2010

Не так.su вызовет процесс, который по умолчанию является оболочкой.В командной строке эта оболочка будет интерактивной, поэтому вы можете вводить команды.В контексте сценария оболочка сразу завершится (потому что она не имеет ничего общего).

С

su user -c command

command будет выполняться как user - еслиsu завершается успешно, что обычно имеет место только для пользователей без пароля или при запуске сценария от имени пользователя root.

Используйте sudo для лучшего и более детального подхода.

4 голосов
/ 06 августа 2010

Нет, ты не можешь. Или хотя бы ... вы можете su, но su просто откроет новую оболочку в этот момент, и когда это будет сделано, она продолжит работу с остальной частью сценария.

Один из способов - использовать su -c 'some command'

2 голосов
/ 01 февраля 2011

Еще одна интересная идея, которую я услышал сегодня, - это сделать рекурсивный вызов сценария, когда вы запускаете от имени пользователя 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
1 голос
/ 05 сентября 2017

См. Ответы в следующем вопросе,

Вы можете написать между << EOF и EOF, как указано в ответах. </p>

#!/bin/bash
whoami
sudo -u someuser bash << EOF
echo "In"
whoami
EOF
echo "Out"
whoami

Как использовать su для выполненияостальная часть скрипта bash от имени этого пользователя?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...