Я пытаюсь разработать сценарий, который автоматизирует настройку нового домена виртуального хостинга на моем сервере. У меня есть настраиваемая настройка на моем сервере, которая дает каждому домену имя пользователя и пароль, но не имеет доступа к оболочке. (это относится к 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, который вы инициализируете в верхней части сценария. Фактически вы делаете одно и то же двумя разными способами, что в какой-то момент приведет к замешательству и разочарованию.