Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

viでの強制上書きにつ いて

4,164 views
Skip to first unread message

Kawabe, Y.

unread,
Jul 28, 2004, 4:30:53 AM7/28/04
to
Solarisでリードオンリー属性のファイルをviで編集後、!wで強制上書きしようとして
も「permission denied」エラーで、上書きできないことに気づきました。普通はでき
るもんだと思ってたんですが、そうじゃないんでしょうか?手元のSolaris2.6、
Solaris8はどちらも×でした。viのマニュアルページを読む限りでは、できると思われ
ますし、実際LINUXやMacOSXなら、問題なく上書きできるんですが。

************************************************
Yoshiaki Kawabe / 川部 喜朗 <k...@jgi.co.jp>
(株)地球科学総合研究所
************************************************

Shinji KONO

unread,
Jul 28, 2004, 7:06:15 AM7/28/04
to
河野真治 @ 琉球大学情報工学です。

In article <BD2D934D.57C0%k...@momo.so-net.ne.jp>, "Kawabe, Y." <k...@momo.so-net.ne.jp> writes


> Solarisでリードオンリー属性のファイルをviで編集後、!wで強制上書きしようとして
> も「permission denied」エラーで、上書きできないことに気づきました。

本当に権限がなければ上書きできないので、そういうことなんじゃないかと。
owner が root だったとかさ。

そういう時は、/tmp に書いてcpするのが普通かな。

(で、passwd のジャンクが/tmpに残ったりする...)

---
Shinji KONO @ Information Engineering, University of the Ryukyus
河野真治 @ 琉球大学工学部情報工学科

IKEDA Kenji

unread,
Jul 28, 2004, 8:20:18 AM7/28/04
to
On Wed, 28 Jul 2004 11:06:15 +0000 (UTC),
In article <3990052...@insigna.ie.u-ryukyu.ac.jp>,
ko...@ie.u-ryukyu.ac.jp (Shinji KONO) wrote:

> 本当に権限がなければ上書きできないので、そういうことなんじゃないかと。

単に vi と nvi(などの viクローン)の仕様の差でしょう。
nvi/common/exf.c の file_write() の当該部分には、

/*
* If the user owns the file but does not
* have write permission on it, grant it
* automatically for the duration of the
* opening of the file, if possible.
*/

などというコメントがあり、chmod して write して chmod し戻してます。
オリジナルはそんなことしてくれないからエラーになる。

--
池田研二 稲城駅前在住

SAITOH Akinori

unread,
Jul 28, 2004, 10:48:33 AM7/28/04
to
齊藤です

Kawabe, Y. wrote:
> Solarisでリードオンリー属性のファイルをviで編集後、!wで強制上書きしようとして
> も「permission denied」エラーで、上書きできないことに気づきました。普通はでき
> るもんだと思ってたんですが、そうじゃないんでしょうか?

できないのが普通です。
viewで起動したときなどviをreadonlyモードで動かしているときには、
うっかり、ZZなどでファイルを書き換えないように、書き込みコマンドを
受け付けないようになっています。

:w!
は、書き込みを行いますが、実際に成功するかどうかはOS側の問題です。

chmodして勝手に書くのは、改悪だと思うがなぁ。便利かもしれんが。

齊藤明紀 saitoh at kankyo-u . ac . jp

Kawabe, Y.

unread,
Jul 28, 2004, 9:09:15 PM7/28/04
to
in article 3990052...@insigna.ie.u-ryukyu.ac.jp, Shinji KONO at
ko...@ie.u-ryukyu.ac.jp wrote on 04.7.28 08:06 PM:

> 本当に権限がなければ上書きできないので、そういうことなんじゃないかと。
> owner が root だったとかさ。

ownerは実行者(私)ですので、権限はあります。


in article 86wu0on...@poe.mob.or.jp, IKEDA Kenji at noro...@mob.or.jp
wrote on 04.7.28 09:20 PM:

> 単に vi と nvi(などの viクローン)の仕様の差でしょう。
> nvi/common/exf.c の file_write() の当該部分には、
>
> /*
> * If the user owns the file but does not
> * have write permission on it, grant it
> * automatically for the duration of the
> * opening of the file, if possible.
> */
>
> などというコメントがあり、chmod して write して chmod し戻してます。
> オリジナルはそんなことしてくれないからエラーになる。

「そんなことしてくれない」のであれば、「w」コマンドと「w!」コマンドの違いって
何なのでしょう?

in article ce8ec1$8gv$1...@caraway.media.kyoto-u.ac.jp, SAITOH Akinori at
sai...@kankyo-u.ac.jp.nospam wrote on 04.7.28 11:48 PM:

> viewで起動したときなどviをreadonlyモードで動かしているときには、
> うっかり、ZZなどでファイルを書き換えないように、書き込みコマンドを
> 受け付けないようになっています。

「ZZ」「w」「wq」など、普段書き込みに使用するコマンドで書き込めないのは当然で
すが、そのために「w!」があるんじゃないんでしょうか?

> :w!
> は、書き込みを行いますが、実際に成功するかどうかはOS側の問題です。

Solarisのviのmanページでは、

:w!CR forced write, if permission originally not valid

とあります。普通に読めば、これはreadonlyであっても強制的に書き込む、と考えら
れますから、内部でchmodするしかないと思うんですけど。
ちなみに、rootであれば、w!は問題なく強制書き込みできます。

ーー
川部

Hideo Sir MaNMOS Morishita

unread,
Jul 28, 2004, 10:00:04 PM7/28/04
to

In article <ce8ec1$8gv$1...@caraway.media.kyoto-u.ac.jp>,

SAITOH Akinori <sai...@kankyo-u.ac.jp.nospam> writes:
> 齊藤です
>
> Kawabe, Y. wrote:
> > Solarisでリードオンリー属性のファイルをviで編集後、!wで強制上書きしようとして
> > も「permission denied」エラーで、上書きできないことに気づきました。普通はでき
> > るもんだと思ってたんですが、そうじゃないんでしょうか?
>
> できないのが普通です。
> viewで起動したときなどviをreadonlyモードで動かしているときには、
> うっかり、ZZなどでファイルを書き換えないように、書き込みコマンドを
> 受け付けないようになっています。

ですよね。

> :w!
> は、書き込みを行いますが、実際に成功するかどうかはOS側の問題です。
>
> chmodして勝手に書くのは、改悪だと思うがなぁ。便利かもしれんが。


ふつーは「^Zで中断して、chmodしてfgしてw!」じゃないんですか。

--
___ わしは、山吹色のかすてーらが大好きでのぅ
[[o o]] ふぉっふぉっふぉ
'J' 森下 お代官様 MaNMOS 英夫@ステラクラフト
PGP Finger = CD EA D5 A8 AD B2 FE 7D 02 74 87 52 7C B7 39 37

IKEDA Kenji

unread,
Jul 28, 2004, 10:07:18 PM7/28/04
to
On Thu, 29 Jul 2004 10:09:15 +0900,
In article <BD2E7D4B.57F0%k...@momo.so-net.ne.jp>,
"Kawabe, Y." <k...@momo.so-net.ne.jp> wrote:

> 「そんなことしてくれない」のであれば、「w」コマンドと「w!」コマンドの違いって
> 何なのでしょう?

w だと、編集中のファイル(もちろん write 権限のある)に上書きするか、
存在しないファイルを新規に作って書くことしかできない。
w!だと、存在してる編集中でないファイル(もちろん write 権限のある)にも
上書きできる。

つうんじゃなかったでしたっけ?

ZZ で read only になったら、suspend して chmod +w してから戻って wq! で
書き直す癖が付いているので、たぶんこうだったんではないかと。

> :w!CR forced write, if permission originally not valid
>
> とあります。普通に読めば、これはreadonlyであっても強制的に書き込む、と考えら
> れますから、内部でchmodするしかないと思うんですけど。

どこにも、chmod するとは書いてない。!付きだと、permission のチェックを
せずに書きにいくってだけ。

readonly かどうかは、ファイルを読み込むときに記録されてるので、
後から chmod +w しても、単なる w ではチェックにひっかかってしまう。
w! はそういうチェックせずに書きたい時に使う。

--
池田研二 稲城駅前在住

Kawabe, Y.

unread,
Jul 29, 2004, 12:16:30 AM7/29/04
to
川部です。皆さんのレスで、ようやく納得できました。

「:w!CR forced write, if permission originally not valid」

この「originally」とは「読み込み時」のことなんですね。つまり、「w!」は読み込
み時のpermissionのチェックをせず書き込もうとするだけで、読み込んでから「w!」
するまでの間に、permissionが書き込み可能に変化していた場合のみ有効な訳ですね。
あるいは、permission設定に関わらず書き込めるスーパユーザなら問題ないと。

結局通常のユーザの場合は、皆さんがされているように、「^Z」→「chmod +w」→「fg」
を過程を踏まないと「w!」は役に立たないわけで、今風のviクローンではそれを「w!」
に含めちゃっている訳ですな。「改善」なのか「改悪」なのかどうかはよくわかりま
せんが、確かにこれ以外に使える状況が思いつきませんね。

ーー

Yasushi Shinjo

unread,
Jul 29, 2004, 12:38:33 AM7/29/04
to
新城@筑波大学情報です。こんにちは。

In article <86n01jr...@poe.mob.or.jp>


IKEDA Kenji <noro...@mob.or.jp> writes:
> w だと、編集中のファイル(もちろん write 権限のある)に上書きするか、
> 存在しないファイルを新規に作って書くことしかできない。
> w!だと、存在してる編集中でないファイル(もちろん write 権限のある)にも
> 上書きできる。

> ZZ で read only になったら、suspend して chmod +w してから戻って wq! で
> 書き直す癖が付いているので、たぶんこうだったんではないかと。

root だと chmod なくても w! で書けます。root なら一般的にモー
ドが無視できるので。

ただ、root でも w モードがないファイルを w や ZZ で保存しよ
うとすると失敗します。root でも vi としては、起動時に
readonly として認識しているのでしょう。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\

SAITOH Akinori

unread,
Jul 29, 2004, 7:13:25 AM7/29/04
to
齊藤です

Kawabe, Y. wrote:

> ownerは実行者(私)ですので、権限はあります。
それは、chmodする権限があるのであって、write permissionは
出てないですよね。


> 「そんなことしてくれない」のであれば、「w」コマンドと「w!」コマンドの違いって
> 何なのでしょう?

私の記事をよく読んでください。
viのバッファ(とはいわないが)のモードにreadonlyがあるのです。
ファイルのモードとは別に。それをoverrideするかどうか。

> in article ce8ec1$8gv$1...@caraway.media.kyoto-u.ac.jp, SAITOH Akinori at
> sai...@kankyo-u.ac.jp.nospam wrote on 04.7.28 11:48 PM:

> :w!CR forced write, if permission originally not valid

> とあります。普通に読めば、これはreadonlyであっても強制的に書き込む、と考えら
> れますから、内部でchmodするしかないと思うんですけど。

そうですよ。viのreadonlyモードを無視して、ファイルの書き込みを
行います。あとはOS(ファイルパーミッション)がそれを許すかどうかの
問題ですが。

書き込み権のあるファイルを、readonlyモードで viで編集/閲覧することが
あるということを理解してください。

齊藤明紀 saitoh at kankyo-u

0 new messages