sed を使用して index.php ファイルを上書きしようとしていますが、エラーが発生します。
$ sed -i 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php
sed: couldn't open temporary file ./sedmZNx8T: Permission denied
これを修正する方法を知っている人はいますか?
ディレクトリにアクセス許可の問題があるようです/tmp
。(以下で説明するように、 でコマンドを実行するphpshell
ため、TMP dir
以外の場所に設定できます/tmp
)
次のようになります。
$ ls -ld /tmp
drwxrwxrwx 333 root root 32768 12 oct. 03:13 /tmp/
説明
flag で呼び出すsed
と、 dirに一時ファイルが作成されます。-i
sed
/tmp
証明strace
:
$ strace -f -e trace=file sed -i 's/a/z/' /tmp/a
execve("/bin/sed", ["sed", "-i", "s/a/z/", "/tmp/a"], [/* 94 vars */]) = 0
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
(...)
open("/tmp/sedPSBTPG", O_RDWR|O_CREAT|O_EXCL, 0600) = 4
rename("/tmp/sedPSBTPG", "/tmp/a") = 0
+++ exited with 0 +++
index.php
が保存されているディレクトリへの書き込みアクセス権がない場合、通常はindex.php
...?へのアクセス権はありません。これが「非標準」のケースであり、書き込みアクセス権があると仮定するとsed -i
、同じディレクトリに一時ファイルを作成しようとしていますindex.php
(チェックしたところ、CWD ではなく同じディレクトリです)。sed
なしで実行し、結果をホームディレクトリのファイルに書き込む-i
ようなもので行を終了します。> ~/sed.out
次に、そのファイルで必要なことを行います。
sed 's@<head>@<head><script type="text/javascript" src="new.js"></script>@' index.php > ~/sed.out
cp ~/sed.out index.php
できるのにできないことに注意してくださいmv ~/sed.out index.php
。ディレクトリを変更しようとしている間(書き込み権限がないディレクトリを変更するのではなく)cp
にコンテンツを配置するようです(書き込み権限がない)。index.php
mv