Dugaan saya adalah sebagai berikut:
echo "Generating some text" | su - -c cat >/output/file
Tetapi su
mengatakan:
su: must be run from a terminal
Apa yang akan kamu lakukan?
Dugaan saya adalah sebagai berikut:
echo "Generating some text" | su - -c cat >/output/file
Tetapi su
mengatakan:
su: must be run from a terminal
Apa yang akan kamu lakukan?
Jawaban:
sudo
mendukung ini.
$ echo hello world | sudo cat
SUDO password:
hello world
Perbedaannya adalah yang sudo
meminta kata sandi pengguna Anda, bukan kata sandi root
(target user). Namun jika Anda menginginkannya, Anda dapat mengubah perilaku ini dengan targetpw
(atau runaspw
atau rootpw
) arahan dalam sudoers.conf
.
Namun membaca apa yang Anda coba lakukan, sementara ini menyelesaikan masalah peningkatan izin, itu tidak akan melakukan apa yang Anda harapkan. Makna /output/file
tidak akan dibuat sebagai pengguna root, itu akan dibuat / dimodifikasi sebagai pengguna Anda.
Alasan untuk ini adalah bahwa redirection output shell dilakukan sebelum menjalankan perintah. Jadi shell terbuka /output/file
dan meneruskan file yang dibuka ke su
/ sudo
(dan akibatnya, cat
).
Namun Anda dapat menggunakannya tee
untuk melakukan ini sebagai gantinya, karena tee
utilitas akan membuka file itu sendiri.
echo "hello world" | sudo tee /output/file >/dev/null
Pada dasarnya tee
menyalin output ke /output/file
dan STDOUT, namun STDOUT diarahkan ke /dev/null
.
Anda juga bisa:
echo "hello world" | sudo sh -c 'cat > /output/file'
... yang kurang samar.
sudo -v
. Ini akan menanyakan kata sandi Anda jika Anda belum menggunakan sudo dalam beberapa menit.
Asal tahu saja - Anda tidak terbatas pada satu perintah per |pipe
:
this happens | then this | { then ; all of ; this too ; } | before this
Semua proses itu dipanggil pada saat yang sama - tetapi mereka semua menunggu |pipe
sebelum mereka sebelum benar-benar melakukan apa pun - asalkan mereka membaca |pipe
sama sekali, yaitu. Jadi, jika Anda perlu mengevaluasi variabel midstream, atau untuk mengatur pengalihan, Anda bisa. Santai saja.
echo "it takes time" |
{ exec 4>|file ; cat >&4 ; } |
( sleep 1 && cat <file )
it takes time
Ini cara lain:
echo "more of the same" |
( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) |
echo end of pipe
Jika Anda tidak melakukannya ( subshell )
, perintahnya juga $(cat)
akan </dev/tty
berhasil.
Tetapi jika Anda menggunakan dokumen-sini, Anda tidak perlu dua cat
s:
rm ./file
su -c 'cat <&3 >|./file; echo "middle here"' 3<<HERE >&2 | {\
until [ -s ./file ] ; do sleep 1 ; done ;\
sed 's/beginning/end/' ./file ; }
$(echo "this is the beginning" | sed 'a\of the pipeline' | tee /dev/stderr)
HERE
KELUARAN:
this is the beginning
of the pipeline
Password:
middle here
this is the end
of the pipeline
Sebagian besar di atas hanya untuk demo ini. Yang Anda butuhkan adalah:
su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; }
$(echo "something" | and other things)
HERE