我试图开发一个脚本,将自动在我的服务器上设置一个新的虚拟主机域,我有我的服务器上的自定义设置,给每个域的用户名和密码,但没有shell访问。 (这是使用系统用户的vsftpd)它还在/var/www/sites/"domainname.com中创build一个包含所有默认文件的目录。 然后为虚拟主机创build一个/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)
脚本解决scheme:(感谢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 "
问题在于期望对自己进行recursion调用,但该文件是一个混合的bash和期望的脚本。 所以解决的办法是调用期望与-c(string被parsing和执行)
既然你没有发布错误消息,我只是在这里做一个有教养的猜测。 你的脚本是这样的:
# Set new password for user exec expect -f $0 ${1+"$@"}
这个调用期望的脚本的完整path作为parameter passing给期望的“-f”选项…这意味着期望将从脚本的顶部开始执行,而不是紧跟在exec语句之后的“set”行。
这将导致立即的语法错误,因为脚本是一个shell脚本,而不是期望脚本。
您可能希望将期望脚本移动到单独的文件中,然后明确地调用它:
exec expect -f my-expect-script ${1+"$@"}
另外,这不是你的问题,你的脚本同时使用位置variables(例如,“$ 1”)以及在脚本顶部初始化的$ args列表。 你实际上是用两种不同的方式来做同样的事情,这在某种程度上会导致混乱和沮丧。