使用 #!/bin/bash 脚本

使用 #!/bin/bash 脚本

我正在尝试开发一个脚本,该脚本将自动在我的服务器上设置新的虚拟主机域,我的服务器上有一个自定义设置,为每个域提供用户名和密码,但没有 shell 访问权限。(这是使用系统用户对 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
    "

问题在于,expect 正在对自身进行递归调用,但该文件是混合的 bash 和 expect 脚本。因此,解决方案是使用 -c(要解析和执行的字符串)调用 expect

答案1

由于您没有发布错误消息,因此我在此仅进行有根据的猜测。您的脚本执行以下操作:

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

这将调用 expect,并将脚本的完整路径作为参数传递给 expect 的“-f”选项……这意味着 expect 将开始执行从脚本顶部,而不是来自紧跟 exec 语句之后的“set”行。

这将立即导致语法错误,因为该脚本是 shell 脚本,而不是 expect 脚本。

您可能希望将期望脚本移到单独的文件中,然后明确调用它:

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

此外,这与你的问题无关,你的脚本使用了位置变量(例如“$1”)以及你在脚本顶部初始化的 $args 列表。你实际上是在用两种不同的方式做同样的事情,这在某种程度上会导致混乱和沮丧。

相关内容