/ /サーバー上のユーザーが特定のファイルを編集できるようにするにはどうすればよいですか? - linux、perl、permissions、sudo

サーバー上のユーザーが特定のファイルを編集できるようにするにはどうすればよいですか? - linux、perl、permissions、sudo

私はこのコードを作成して、ユーザーが特定のファイルのポートを変更できるようにします。

#Change Port
IRSSIPORT1=`head -n 1 /etc/ports.txt | tail -n 1`
sudo perl -pi -e "s/^$IRSSIPORT1.*n$//g" /etc/ports.txt
sudo perl -pi -e "s/web_port = 8081/web_port = $IRSSIPORT1/g" .sickbread/config.ini
echo "sickbread Port: $IRSSIPORT1" | sudo tee -a $HOME/private/SBinfo.txt

このコードがしていることは、ファイルを作成し、それを変更する必要があるconfigファイルに置き、それを取得した場所からの最初のファイルからその番号を削除しますが、書き込みアクセスだけでなく書き込みアクセスも必要です。

私はsudoなしでそれを動作させるために私の知識のすべてを試しましたが、私はそれをやり遂げませんでした。

なにか提案を?

私はこのエラーを受け取ります -

/etc/ports.txtを削除できません:許可が拒否され、ファイルがスキップされます。

回答:

回答№1は0

インプレース編集はできません 666 内部のファイル /etc として -i スイッチは新しいファイルを作り、ディレクトリ内の古いファイルを削除します。

ユーザーはファイルを追加/削除するのに十分な権限がありません /etc (そうすることはお勧めできません)、すべてのファイルコンテンツを一度に読み込み、変更して、同じファイルに書き戻す必要があります。一時ファイルを使用することも実行可能な解決策です。


回答№2の場合は0

その質問はプログラミングについてではなくシステム管理に関するものだと思われるかもしれませんが、実際にはperlについては幾分ですので、ここでは良い場所になるかもしれません。

行うこと chmod 666 /etc/ports.txt すべてのユーザーにこれに対する読み取り/書き込みアクセスを許可します。特定のファイル(もちろん、実行可能ファイルやスクリプトではないので、777を置く必要はありません)。だから、誰でもこのファイルを書いて開き、その中に内容を入れることができます。

しかし、あなたがそうするとき perl -pi -e ... /etc/ports.txt そのファイルに書き込むだけではなく、代わりに、このファイルを削除してから再作成したいと思うでしょう。 strace 出力:

# strace perl -pi -e "s/a/b/" /etc/ports.txt 2>&1 | grep /etc/ports.txt
...
open("/etc/ports.txt", O_RDONLY)        = 3
unlink("/etc/ports.txt")                = 0
open("/etc/ports.txt", O_WRONLY|O_CREAT|O_EXCL, 0600) = 4

ファイルを削除するには、ファイル自体ではなくディレクトリに書き込みアクセス権が必要です /etcもちろん、どのユーザーにも与えることはできません。

だから私はあなたが単に使用する必要はありません常にファイルの削除や名前の変更に関連したインプレース編集が可能ですが、代わりにファイルの内容を取得し、必要な変更を加えてから同じファイルに書き戻します。