Ubuntu
使用 #!/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
由於您尚未發布錯誤消息,因此我只是在這裡進行有根據的猜測。您的腳本執行此操作:
# 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 列表。你實際上是以兩種不同的方式做同樣的事情,這在某些時候會導致混亂和沮喪。