Linux Permission denied 問題
來源 https://www.cnblogs.com/sparkdev/p/10287164.html
如果當前用戶沒有某個文件的寫權限,又要通過輸出重定向往該文件中寫入內容。結果只能是 "Permission denied"。比如當前用戶為 nick,下面的命令視圖查詢 /root 目錄下的文件並把結果寫入到 /root/test.txt 文件中(注意:用戶 nick 沒有對 /root/test.txt 文件的寫權限):
$ sudo ls -al /root/test.txt $ sudo ls -al /root > /root/test.txt
Permission denied 的原因
sudo ls -al /root > /root/test.txt 命令不工作的原因是:
雖然 ls 命令是以 sudo 方式執行的,但是輸出重定向操作是由當前 shell 執行的,它(當前 shell)沒有 /root/test.txt 文件的權限,所以最終失敗。
搞清楚了原因,就可以通過不同的方式來解決這個問題了,下面介紹四種方式。
以 sudo 方式運行 shell
既然是 shell 進程沒有權限,那就用 sudo 的方式執行 shell:
$ sudo bash -c 'ls -al /root > /root/test.txt'
把命令寫入腳本,以 sudo 方式執行腳本
把下面的代碼保存到腳本文件 test.sh 中:
#!/bin/bash ls -al /root > /root/test.txt
然后通過下面的方式執行:
$ chmod +x test.sh $ sudo ./test.sh
如果覺着創建腳本麻煩的話還可以使用變通的方式:
$ sudo bash <<EOF > ls -al /root > /root/test.txt > EOF
或者是下面的寫法:
$ echo 'ls -al /root > /root/test.txt' | sudo bash
先通過 sudo -s 啟動 shell,然后執行命令
先通過 sudo -s 命令切換到 root 用戶再執行命令,最后 ctrl + d 退出:
通過 sudo tee 命令實現
Tee 命令用於將數據重定向到文件,另一方面還可以提供一份重定向數據的副本作為后續命令的 stdin。簡單的說就是把數據重定向到給定文件和屏幕上(下圖來自互聯網):
下面的命令中通過 sudo tee 把 ls 命令的輸出寫入文件:
$ sudo ls -al /root | sudo tee /root/test.txt > /dev/null
其中的 > /dev/null 阻止 tee 把內容輸出到終端:
參考:
linux – 如何使用sudo將輸出重定向到一個我沒有權限寫入的位置?
====================== End