Bash

通過 SSH 將數據寫入文件有權限錯誤,即使使用 sudo

  • April 14, 2021

我正在創建一個自動化腳本。作為其中的一部分,我想添加一個 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文件描述符stdoutexec程序。然後要麼 要麼/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 ... "

引用自:https://unix.stackexchange.com/questions/644897