sudo 與輸出重定向

本文介紹如何使用 sudo 將輸出重定向到當前用戶沒有權限的文件。
注意:本文中 demo 的演示環境爲 ubuntu 18.04。html

Permission denied 問題

若是當前用戶沒有某個文件的寫權限,又要經過輸出重定向往該文件中寫入內容。結果只能是 "Permission denied"。好比當前用戶爲 nick,下面的命令視圖查詢 /root 目錄下的文件並把結果寫入到 /root/test.txt 文件中(注意:用戶 nick 沒有對 /root/test.txt 文件的寫權限):linux

$ 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 文件的權限,因此最終失敗。shell

搞清楚了緣由,就能夠經過不一樣的方式來解決這個問題了,下面介紹四種方式。ubuntu

以 sudo 方式運行 shell

既然是 shell 進程沒有權限,那就用 sudo 的方式執行 shell:bash

$ sudo bash -c 'ls -al /root > /root/test.txt'

把命令寫入腳本,以 sudo 方式執行腳本

把下面的代碼保存到腳本文件 test.sh 中:spa

#!/bin/bash
ls -al /root > /root/test.txt

而後經過下面的方式執行:code

$ chmod +x test.sh
$ sudo ./test.sh

若是覺着建立腳本麻煩的話還能夠使用變通的方式:htm

$ sudo bash <<EOF
> ls -al /root > /root/test.txt
> EOF

或者是下面的寫法:blog

$ 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將輸出重定向到一個我沒有權限寫入的位置?

相關文章
相關標籤/搜索