多くの場合、構成ファイルを編集しているときに、viでファイルを開き、保存しようとすると、入力しなかったことに気付きます。
sudo vi filename
ファイルを保存するためのvisudo権限を与える方法はありますか?少し前にviについて調べていたときに、これについて何かを見たことを思い出しているようですが、今は見つかりません。
%
は現在のファイル名に置き換えられるため、次を使用できます。
:w !sudo tee %
(vim
ファイルが変更されたことを検出し、再読み込みするかどうか尋ねます。[ [L]
OK] ではなく [はい] を選択して、[はい] を選択します。)
ショートカットとして、独自のコマンドを定義できます。あなたのに次を入れてください.vimrc
:
command W w !sudo tee % >/dev/null
上記で、入力:W<Enter>
してファイルを保存できます。私がこれを書いて以来、私はこれを行うためのより良い方法を(私の意見では)見つけました:
cmap w!! w !sudo tee >/dev/null %
このように入力:w!!
すると、コマンドライン全体に展開され、カーソルが最後に残るため、必要%
に応じて独自のファイル名に置き換えることができます。
一般に、vi プロセスの実効ユーザー ID を変更することはできませんが、次のようにすることができます。
:w !sudo tee myfile
読み取り専用ファイルの問題を回避する最も一般的な方法は、の実装を使用してスーパーユーザーとして現在のファイルへのパイプを開くことです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
。できるだけ早くダンプするのが最善です。 NUL
DOS、MS-DOS、およびWindowsのnullデバイスであり、有効なファイルではありません。Windows 8以降、NULにリダイレクトしても、NULという名前のファイルが書き込まれることはありません。デスクトップにNULという名前のファイルを作成してみてください。ファイル拡張子の有無にかかわらず、作成できません。(Windowsには、知っておく価値のあるデバイス名が他にもいくつかあります。)
もちろん、あなたはまだそれらを覚えて、毎回それらをタイプしたくありません。適切なコマンドをより単純なユーザーコマンドにマップする方がはるかに簡単です。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
Ryanのアドバイスは一般的には良いですが、ステップ3に従う場合は、一時ファイルを移動しないでください。所有権と権限が間違っています。代わりにsudoedit
、正しいファイルを作成し:r
、一時ファイルの内容(を使用するなど)を読み込みます。
手順2に従う場合は、を使用:w!
してファイルを強制的に書き込みます。
編集に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
おそらく、それを行うためのより簡単な方法がありますが、機能します。
簡単なグーグルはこのアドバイスを与えるようです:
この質問への回答後に表示された別のプラグインは、SudoRead および SudoWrite 関数を提供する SudoEdit と呼ばれるプラグインです。デフォルトでは、最初に sudo を使用し、失敗した場合は su を使用しようとします: http://www.vim.org/scripts/ script.php?script_id=2709
~/.bashrc にこれがあります:
alias svim='sudo vim'
設定ファイルを編集する必要があるときはいつでも、svim で開くだけです。
考えられる簡単なハックは、編集中のファイルに対して 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)
もちろん、セキュリティが心配なシステムでは、このアプローチはお勧めしません。数秒間、誰もが気付かずにファイルを読み取ったり変更したりできるからです。