Ubuntu

使用 #!/bin/bash 腳本

  • November 17, 2010

我正在嘗試開發一個腳本,該腳本將自動在我的伺服器上設置一個新的虛擬主機域,我在我的伺服器上有一個自定義設置,它為每個域提供了使用者名和密碼,但沒有 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

由於您尚未發布錯誤消息,因此我只是在這裡進行有根據的猜測。您的腳本執行此操作:

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

這呼叫 expect 並將腳本的完整路徑作為參數傳遞給 expect 的“-f”選項…這意味著 expect 將從腳本的頂部開始執行,而不是從緊跟在 exec 語句之後的“set”行開始執行.

這將導致立即出現語法錯誤,因為該腳本是一個 shell 腳本,而不是一個期望腳本。

您可能希望將期望腳本移動到單獨的文件中,然後顯式呼叫它:

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

此外,這不是您的問題的日耳曼語,您的腳本使用兩個位置變數(例如,“ $ 1") as well as the $ 您在腳本頂部初始化的 args 列表。你實際上是以兩種不同的方式做同樣的事情,這在某些時候會導致混亂和沮喪。

引用自:https://serverfault.com/questions/203077