web-dev-qa-db-ja.com

sudoとして実行するのを忘れた後、nanoからSudoとして保存できますか?

多くの場合、nanoでファイルを編集し、それをSudoとして実行するのを忘れたため、保存して権限エラーを取得しようとします。ファイルを再度開いて編集せずにSudoになる簡単な方法はありますか?

53
Kit Sunde

いいえ、実行中のプログラムに、起動時に持っていないアクセス許可を与えることはできません。これは、「特権の昇格」と呼ばれるセキュリティホールになります。

あなたができる2つのこと:

  1. / tmpなどの一時ファイルに保存し、エディターを閉じて、一時ファイルの内容を編集中のファイルにダンプします。 Sudo cp $TMPFILE $FILE。ファイルの所有権とアクセス許可が変更される可能性があるため、mvを使用することはお勧めしません。ファイルのプレースホルダー自体ではなく、ファイルのコンテンツを置き換えるだけです。
  2. エディターの背景 Ctrl+z、ファイルの所有権または権限を変更して書き込みできるようにしてから、fgを使用してエディターに戻り、保存します。権限を修正することを忘れないでください!

¹ 一部の編集者は、実際にはこれを行うために、さまざまな権限で新しいプロセスを起動し、データをそのプロセスに渡して保存します。たとえば、ファイルバッファーをプロセスパイプに書き込むことができる高度なエディターの他のソリューションについては、 この関連する質問 を参照してください。 Nanoには、新しいプロセスを起動したり、データを他のプロセスに渡したりする機能がないため、このパーティーには参加しません。

43
Caleb

私はnanoを試してみましたが、最も驚いたのは、ファイルの編集を開始したときにファイルが読み取り専用であることを警告するものではありませんでした。 (更新:どうやらnano 2.2は警告します; 2.0は警告しません。

これを行う(基本的な)スクリプトを次に示します。

ファイルを編集できるかどうかをチェックし、編集できない場合は、代わりに「nano」をrootとして実行します。

/ usr/local/bin/edit(または〜/ bin/edit

Sudo=                       # empty is false, non-empty is true
editor=nano                 # XXX check $EDITOR and $VISUAL

if test -e "$1" && test ! -w "$1"; then
    if test -t 0 && test -t 2; then
        printf "%s is not writable.  Edit with sudo? [y/n] " "$1" 1>&2
        read -n 1
        case $REPLY in
        y|Y)
            Sudo=true
            ;;
        n|N)
            Sudo=
            ;;
        *)
            printf "\nExpected y or n.  Exiting.\n" 1>&2
            exit 1
            ;;
        esac
    else
        printf "%s is not writable.  Fix the permissions or run \"view\" instead." "$1" 1>&2
        exit 1
    fi
fi

${Sudo:+Sudo} "$editor" "$1"

そして、私がviewと呼んだコマンドは、変更を行わないことがわかっている場合にプロンプ​​トを回避できるようにするためです。

/ usr/local/bin/view(または〜/ bin/view

editor=nano
readonlyflag=-v

"$editor" $readonlyflag "$1"

Vi/Vimの一部であるviewと呼ばれるプログラムがすでにあるので、もっと良い名前を提案してください。
(しかし、このプログラムを完全に実装すると、Viのviewが冗長になると思います。)


フルバージョン

7
Mikel