sudoとして実行するのを忘れた後、nanoからsudoとして保存することは可能ですか?


49

多くの場合、nanoでファイルを編集し、sudoとして実行するのを忘れたため、保存してアクセス許可エラーを取得しようとします。ファイルを再度開いて再編集しなくてもsudoになれる簡単な方法はありますか?


この質問との統合が提案されています。基本的には同じ問題が、vim。私はマージを検討しています...しかし、vim固有の命令が機能しないという事実も検討していnanoます。
-xenoterracide

1
@xenaterracide-vimの質問はこの質問の特別なケースだと思います。なぜなら、その質問には実際に解決策があり、一般的な質問にはないようです。どちらにしても、あなた次第です。:)
キットSunde

.vimrcでマッピングを作成して、sudo tee関数を簡単に呼び出すことができます。<pre> <code> "ルート権限を持つファイルへの書き込みを許可します/ code>
jasonwryan

@xenoterracide:ナノについてのカレブの答えは役に立つので、これについてはナノについてだけにしておくべきだと思います。
ミケル

1
@mikelマージは無効であると判断しました。...ではなく、に類似した解決策nanoはありません。vimnanovim
xenoterracide

回答:


37

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

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

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

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


優れた。ありがとうカレブ。ちょうど30分前にこの問題に遭遇しました。:)
boehj

2
@Caleb vim内からteeコマンドを使用して、説明したことを実行できます:w !sudo tee

@hellojesus素晴らしいトリック。あなたが答えとしてそれを書きたいと思うなら、私はそれを私のものから取り除くことができます。nanoユーザー以外の人がこの状況に陥り、ここにいる可能性があると思います。
カレブ

4
この質問はナノに関するものであると思われます。ここでVimについての回答を含めると、この質問のポイントは何ですか?Vim for Vimの内部から既にルート化されています。
ミケル

2
で/ tmpに一時ファイルに保存 - 内部のナノながら、一時ファイルに保存する方法は?
アナンドRockzz

7

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

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

ファイルを編集できるかどうかを確認し、編集できない場合は、代わりにルートとして「nano」を実行します。

/ 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"

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


フルバージョン


1
実際には警告が表示されます。質問は、使用しているバージョンです。また、Debianベースのシステムでは、代替システムがあなたの提案に適しています。
0xC0000022L

2
ご参考までに:[ Read ... lines (Warning: No write permission) ]ショートカットの2行のヘルプ(画面下部)のすぐ上に表示されます。Nanoバージョンは2.2.4です。
0xC0000022L

ああ、それはnano 2.0では警告しません。それは私がテストしていたことです。
ミケル

クールに整理しました:)
0xC0000022L
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.