Bash
通過 SSH 將數據寫入文件有權限錯誤,即使使用 sudo
我正在創建一個自動化腳本。作為其中的一部分,我想添加一個 cron 作業。這是失敗的腳本的一部分:
BACKUP_USER=backupbot SCRIPT_NAME=backup-script.sh scp -i ./ssh-key ./$SCRIPT_NAME user@server:/tmp ssh -i ./ssh-key user@server " sudo mv /tmp/$SCRIPT_NAME /home/$BACKUP_USER/bin/ && sudo chown $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME && sudo chmod 100 /home/$BACKUP_USER/bin/$SCRIPT_NAME && sudo sed -i 's/THE_URL/'${1}'/' /home/$BACKUP_USER/bin/$SCRIPT_NAME && sudo echo '*/1 * * * *' $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME > /etc/cron.d/discourse-backup"
有問題的命令是:
sudo echo '*/1 * * * *' $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME > /etc/cron.d/discourse-backup
我越來越:
bash:第 5 行:/etc/cron.d/discourse-backup:權限被拒絕
在此之前,一切都按應有的方式執行。我的最後一個命令有什麼問題?我認為這是引號的一些問題 - 我嘗試了單引號和雙引號的多種組合,但我最終得到了相同(或更糟)的結果。
當您執行類似的命令時
sudo echo some text > file
重定向是由您的 shell 在執行之前以普通使用者身份完成的
sudo
。編輯,回答評論:
與其他命令相比, shell 不會將
sudo
其視為任何特定的東西,並且它不知道sudo
將以提升的權限執行。shell 的行為將與
/bin/echo some text > file
當 shell 解析上面的命令行之一時,它會找到重定向。所以它將首先打開文件,然後
fork
是程序執行的程序,dup
文件描述符stdout
和exec
程序。然後要麼 要麼/bin/echo
已經重定向sudo
執行。stdout
在您的案例中,以普通使用者身份打開重定向文件將失敗。
嘗試類似的東西
echo '*/1 * * * *' $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME | sudo tee /etc/cron.d/discourse-backup >/dev/null
在這種情況下,該文件是一個命令行參數
sudo
,將為其執行root
,然後將文件名參數傳遞給tee
該參數,然後將使用提升的權限執行該參數。這將允許tee
打開文件進行寫入。第二次編輯:這個答案的重點是解決
sudo
與重定向相關的問題,而不是其他可能的問題。正如使用者cas在評論中提到的那樣,應該單獨或作為整個字元串引用變數,例如echo "*/1 * * * * $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME" | sudo ...
在問題的案例中,由於兩個原因,引用可能不太重要。參數僅用於
echo
,輸出必須是有效crontab
行。無論如何,這會禁止變數中出現幾個“有問題的”字元。但總的來說,始終建議正確引用。由於此命令將是較長引號字元串的一部分,因此可以轉義引號,例如
ssh -i ./ssh-key user@server " ... echo \"*/1 * * * * $BACKUP_USER /home/$BACKUP_USER/bin/$SCRIPT_NAME\" | sudo ... "