Подтвердить что ты не робот

Я могу запустить 'su' в середине bash script?

Можно ли изменить /su пользователя в середине script?

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
4b9b3361

Ответ 1

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

su postgres -c 'dropdb $user'

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

Ответ 2

Вы можете использовать здесь документ, чтобы внедрить несколько команд su в script:

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

Ответ 3

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

С

su user -c command

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

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

Ответ 4

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

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

Ответ 5

Еще одна интересная идея, которую я услышал сегодня, - это сделать рекурсивный вызов script при запуске от имени пользователя root, и вы хотите запустить script в качестве другого пользователя. См. Пример ниже:

Я запускаю script "my_script" как "root" и хочу, чтобы script запускался как пользовательский "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