252

多くの場合、構成ファイルを編集しているときに、viでファイルを開き、保存しようとすると、入力しなかったことに気付きます。

sudo vi filename

ファイルを保存するためのvisudo権限を与える方法はありますか?少し前にviについて調べていたときに、これについて何かを見たことを思い出しているようですが、今は見つかりません。

4

10 に答える 10

306

%は現在のファイル名に置き換えられるため、次を使用できます。

:w !sudo tee %

(vimファイルが変更されたことを検出し、再読み込みするかどうか尋ねます。[ [L]OK] ではなく [はい] を選択して、[はい] を選択します。)

ショートカットとして、独自のコマンドを定義できます。あなたのに次を入れてください.vimrc

command W w !sudo tee % >/dev/null

上記で、入力:W<Enter>してファイルを保存できます。私がこれを書いて以来、私はこれを行うためのより良い方法を(私の意見では)見つけました:

cmap w!! w !sudo tee >/dev/null %

このように入力:w!!すると、コマンドライン全体に展開され、カーソルが最後に残るため、必要%に応じて独自のファイル名に置き換えることができます。

于 2008-08-31T19:23:48.347 に答える
33

一般に、vi プロセスの実効ユーザー ID を変更することはできませんが、次のようにすることができます。

:w !sudo tee myfile
于 2008-08-04T06:52:32.270 に答える
19

一般的な警告

読み取り専用ファイルの問題を回避する最も一般的な方法は、の実装を使用してスーパーユーザーとして現在のファイルへのパイプを開くことですsudo tee。ただし、インターネットで見つけた最も人気のあるソリューションにはすべて、いくつかの潜在的な警告が組み合わされています。

  • ファイル全体とファイルが端末に書き込まれます。これは、特に遅いネットワーク接続では、大きなファイルの場合は遅くなる可能性があります。
  • ファイルはそのモードと同様の属性を失います。
  • 異常な文字やスペースを含むファイルパスは正しく処理されない場合があります。

ソリューション

これらすべての問題を回避するには、次のコマンドを使用できます。

" On POSIX (Linux/Mac/BSD):
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

" Depending on the implementation, you might need this on Windows:
:silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >NUL'

これらは、敬意を表して短縮することができます。

:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'
:sil exec 'w !sudo tee ' . shellescape(@%, 1) . ' >NUL'

説明

:コマンドを開始します。コマンドの入力を開始するには、通常モードでこの文字を入力する必要があります。スクリプトでは省略してください。

sil[ent]コマンドからの出力を抑制します。この場合、コマンドPress any key to continueの実行後に表示される-likeプロンプトを停止します:!

exec[ute]文字列をコマンドとして実行します。:write必要な関数呼び出しを処理しないため、実行することはできません。

!コマンドを表します:受け入れる:!唯一のコマンド。:write通常、:write書き込み先のファイルパスを受け入れます。 :!シェルでコマンドを実行します(たとえば、を使用してbash -c)。を使用:writeすると、シェルでコマンドが実行され、ファイル全体がに書き込まれstdinます。

sudoそれがあなたがここにいる理由なので、明白なはずです。スーパーユーザーとしてコマンドを実行します。それがどのように機能するかについては、ネットの周りにたくさんの情報があります。

tee指定されたファイルにパイプstdinします。 :writeに書き込みます。stdinその後、スーパーユーザーteeはファイルの内容を受け取り、ファイルに書き込みます。新しいファイルは作成されず、内容が上書きされるだけなので、ファイルのモードと属性は保持されます。

shellescape()現在のシェルに応じて、指定されたファイルパスの特殊文字をエスケープします。パラメータが1つしかない場合、通常は必要に応じてパスを引用符で囲みます。フルシェルコマンドラインに送信しているので、2番目の引数としてゼロ以外の値を渡して、シェルをつまずかせる可能性のある他の特殊文字のバックスラッシュエスケープを有効にします。

@%%現在のバッファのファイル名を含むレジスタの内容を読み取ります。必ずしも絶対パスである必要はないため、現在のディレクトリを変更していないことを確認してください。一部のソリューションでは、コマーシャルアットマークが省略されています。場所によっては、は有効な式であり、レジスタ%を読み取るのと同じ効果があります。%ただし、この場合のように、別の式の中にネストされているショートカットは通常は許可されていません。

>NULプラットフォームのnullデバイスにリダイレクト>/dev/nullします。stdoutコマンドを無音にしましたが、vimへのパイピングに関連するすべてのオーバーヘッドは必要ありませんstdin。できるだけ早くダンプするのが最善です。 NULDOS、MS-DOS、およびWindowsのnullデバイスであり、有効なファイルではありません。Windows 8以降、NULにリダイレクトしても、NULという名前のファイルが書き込まれることはありません。デスクトップにNULという名前のファイルを作成してみてください。ファイル拡張子の有無にかかわらず、作成できません。(Windowsには、知っておく価値のあるデバイス名が他にもいくつかあります。)

〜/ .vimrc

プラットフォームに依存

もちろん、あなたはまだそれらを覚えて、毎回それらをタイプしたくありません。適切なコマンドをより単純なユーザーコマンドにマップする方がはるかに簡単です。POSIXでこれを行うには、~/.vimrcファイルに次の行を追加して、まだ存在しない場合は作成します。

command W silent execute 'write !sudo tee ' . shellescape(@%, 1) . ' >/dev/null'

これにより、:W(大文字と小文字を区別する)コマンドを入力して、スーパーユーザー権限で現在のファイルを書き込むことができます。これははるかに簡単です。

プラットフォームに依存しない

コンピューター間で同期するプラットフォームに依存しない~/.vimrcファイルを使用しているので、マルチプラットフォーム機能を追加しました。~/.vimrc関連する設定のみを使用したものは次のとおりです。

#!vim
" Use za (not a command; the keys) in normal mode to toggle a fold.
" META_COMMENT Modeline Definition: {{{1
" vim: ts=4 sw=4 sr sts=4 fdm=marker ff=unix fenc=utf-8
"   ts:     Actual tab character stops.
"   sw:     Indentation commands shift by this much.
"   sr:     Round existing indentation when using shift commands.
"   sts:    Virtual tab stops while using tab key.
"   fdm:    Folds are manually defined in file syntax.
"   ff:     Line endings should always be <NL> (line feed #09).
"   fenc:   Should always be UTF-8; #! must be first bytes, so no BOM.


" General Commands: User Ex commands. {{{1
    command W call WriteAsSuperUser(@%)         " Write file as super-user.


" Helper Functions: Used by user Ex commands. {{{1
    function GetNullDevice() " Gets the path to the null device. {{{2
        if filewritable('/dev/null')
            return '/dev/null'
        else
            return 'NUL'
        endif
    endfunction

    function WriteAsSuperUser(file) " Write buffer to a:file as the super user (on POSIX, root). {{{2
        exec '%write !sudo tee ' . shellescape(a:file, 1) . ' >' . GetNullDevice()
    endfunction


" }}}1
" EOF
于 2012-10-13T06:54:18.770 に答える
11

Vimを使用している場合は、 sudo.vimという名前のスクリプトを利用できます。読み取るためにrootアクセスが必要なファイルを開いたことがわかった場合は、次のように入力します。

:e sudo:%
Vimは%を現在のファイルの名前に置き換え、sudo:sudo.vimスクリプトに読み取りと書き込みを引き継ぐように指示します。

于 2008-09-24T04:12:25.080 に答える
7

Ryanのアドバイスは一般的には良いですが、ステップ3に従う場合は、一時ファイルを移動しないでください。所有権と権限が間違っています。代わりにsudoedit、正しいファイルを作成し:r、一時ファイルの内容(を使用するなど)を読み込みます。

手順2に従う場合は、を使用:w!してファイルを強制的に書き込みます。

于 2008-08-04T04:04:52.110 に答える
3

編集にsudoアクセスが必要なファイルで挿入モードに入ると、次のステータスメッセージが表示されます

-- INSERT -- W10: Warning: Changing a readonly file

私がそれを逃した場合、通常はそうします

:w ~/edited_blah.tmp
:q

..それから..

sudo "cat edited_blah.tmp > /etc/blah"

..また..

sudo mv edited_blah.tmp /etc/blah

おそらく、それを行うためのより簡単な方法がありますが、機能します。

于 2008-08-12T18:37:53.133 に答える
1

簡単なグーグルはこのアドバイスを与えるようです:

  1. 読み取り専用の場合は編集しないでください。
  2. ファイルの権限を変更できる場合があります。(保存できるかどうかは実験次第です。)
  3. それでも編集した場合は、一時ファイルに保存してから移動してください。

http://ubuntuforums.org/showthread.php?t=782136

于 2008-08-04T03:39:31.163 に答える
1

この質問への回答後に表示された別のプラグインは、SudoRead および SudoWrite 関数を提供する SudoEdit と呼ばれるプラグインです。デフォルトでは、最初に sudo を使用し、失敗した場合は su を使用しようとします: http://www.vim.org/scripts/ script.php?script_id=2709

于 2010-01-29T17:21:29.890 に答える
0

~/.bashrc にこれがあります:

alias svim='sudo vim'

設定ファイルを編集する必要があるときはいつでも、svim で開くだけです。

于 2009-03-19T12:51:48.797 に答える
-2

考えられる簡単なハックは、編集中のファイルに対して chmod を実行し、vim で保存してから、元のファイルに chmod を戻すことです。

ls -l test.file (to see the permissions of the file)
chmod 777 test.file
[This is where you save in vim]
chmod xxx test.file (restore the permissions you found in the first step)

もちろん、セキュリティが心配なシステムでは、このアプローチはお勧めしません。数秒間、誰もが気付かずにファイルを読み取ったり変更したりできるからです。

于 2008-08-05T22:20:58.403 に答える