Назад | Перейти на главную страницу

Использование сценария #! / Bin / bash

Я пытаюсь разработать сценарий, который автоматизирует настройку нового домена виртуального хостинга на моем сервере. У меня есть настраиваемая настройка на моем сервере, которая дает каждому домену имя пользователя и пароль, но не имеет доступа к оболочке. (это относится к vsftpd с использованием системных пользователей) Он также создает каталог в /var/www/sites/"domainname.com "со всеми файлами по умолчанию в нем. Затем создал файл /etc/apache2/sites-available/domaindname.com Apache Conf для виртуального хоста. Этот сценарий ошибается, но все равно выглядит так, будто он все завершает. Я бы хотел, чтобы ошибка исчезла.

#!/bin/bash
#\
args=("$@")
# Copy Site Hosting Directory
cp -a /var/www/sites/skeleton /var/www/sites/${args[0]}

# Copy Apache Config File
cp -a "/etc/apache2/sites-available/skeleton" "/etc/apache2/sites-available/$1"

# Replace 'skeleton' with '$1' in config file
sed -i "s/skeleton/$1/g" /etc/apache2/sites-available/$1

# Create User
useradd -d /var/www/sites/$1 -s /usr/sbin/nologin $1

chown -R $1:www-data /var/www/sites/$1
chmod -R 0775 /var/www/sites/$1

# Set new password for user
exec expect -f $0 ${1+"$@"}
set password [lindex $argv 1]
spawn passwd [lindex $argv 0]
sleep 1
expect "assword:"
send "$password\r"
expect "assword:"
send "$password\r"
expect eof

Я получаю следующее сообщение об ошибке:

can't read "args[0]": no such variable
    while executing
"cp -a /var/www/sites/skeleton /var/www/sites/${args[0]}"
    (file "./test" line 5)

Решение сценария: (благодаря помощи пользователей serverfault)

#!/bin/bash

# Copy Site Hosting Directory
cp -a /var/www/sites/skeleton /var/www/sites/$1

# Copy Apache Config File
cp -a "/etc/apache2/sites-available/skeleton" "/etc/apache2/sites-available/$1"

# Replace 'skeleton' with '$1' in config file
sed -i "s/skeleton/$1/g" /etc/apache2/sites-available/$1

# Create User
useradd -d /var/www/sites/$1 -s /usr/sbin/nologin $1

chown -R $1:www-data /var/www/sites/$1
chmod -R 0775 /var/www/sites/$1

# Set new password for user
# /usr/bin/expect -f $0 ${1+"$@"}
expect -c "
    spawn passwd $1
    sleep 1
    expect \"assword:\"
    send \"$2\r\"
    expect \"assword:\"
    send \"$2\r\"
    expect eof
    "

Проблема в том, что ожидание выполняло рекурсивный вызов самого себя, но файл был смешанным сценарием bash и ожиданием. Итак, решение состоит в том, чтобы вызвать ожидание с помощью -c (строка для анализа и выполнения)

Поскольку вы не отправляли сообщение об ошибке, я просто делаю обоснованное предположение. Ваш сценарий делает это:

# Set new password for user
exec expect -f $0 ${1+"$@"}

Это вызывает ожидание с полным путем к вашему сценарию, переданным в качестве аргумента ожидания параметра "-f" ... что означает, что ожидание начнет выполняться из верхней части вашего скрипта, а не из строки «set», следующей сразу за оператором exec.

Это вызовет немедленную синтаксическую ошибку, потому что сценарий является сценарием оболочки, а не сценарием ожидания.

Вероятно, вы захотите переместить ожидаемый сценарий в отдельный файл, а затем явно вызвать его:

exec expect -f my-expect-script ${1+"$@"}

Кроме того, и это не имеет отношения к вашему вопросу, ваш сценарий использует обе переменные позиции (например, "$ 1"), а также список $ args, который вы инициализируете в верхней части сценария. Фактически вы делаете одно и то же двумя разными способами, что в какой-то момент приведет к замешательству и разочарованию.