Tôi đoán là như sau:
echo "Generating some text" | su - -c cat >/output/file
Nhưng su
nói:
su: must be run from a terminal
Bạn sẽ làm gì?
Tôi đoán là như sau:
echo "Generating some text" | su - -c cat >/output/file
Nhưng su
nói:
su: must be run from a terminal
Bạn sẽ làm gì?
Câu trả lời:
sudo
hỗ trợ này
$ echo hello world | sudo cat
SUDO password:
hello world
Sự khác biệt là sudo
yêu cầu mật khẩu người dùng của bạn, không phải mật khẩu root
(người dùng mục tiêu). Tuy nhiên nếu bạn rất mong muốn, bạn có thể thay đổi hành vi này bằng chỉ thị targetpw
( runaspw
hoặc rootpw
) trong sudoers.conf
.
Tuy nhiên, đọc những gì bạn đang cố gắng làm, trong khi điều này giải quyết vấn đề leo thang cấp phép, nó sẽ không làm những gì bạn mong đợi. Ý nghĩa /output/file
sẽ không được tạo như người dùng root, nó sẽ được tạo / sửa đổi như người dùng của bạn.
Lý do cho điều này là việc chuyển hướng đầu ra shell được thực hiện trước khi gọi bất kỳ lệnh nào. Vì vậy, shell mở /output/file
và sau đó chuyển tập tin đã mở sang su
/ sudo
(và do đó, cat
).
Tuy nhiên, bạn có thể sử dụng tee
để làm điều này thay vào đó, vì tee
tiện ích sẽ tự mở tệp.
echo "hello world" | sudo tee /output/file >/dev/null
Về cơ tee
bản sao chép đầu ra vào /output/file
và STDOUT, tuy nhiên STDOUT được chuyển hướng vào /dev/null
.
Bạn cũng có thể làm:
echo "hello world" | sudo sh -c 'cat > /output/file'
... Đó là ít khó hiểu hơn.
sudo -v
. Nó sẽ hỏi mật khẩu của bạn nếu bạn chưa sử dụng sudo trong vài phút.
Chỉ để bạn biết - bạn không bị giới hạn trong một lệnh duy nhất cho mỗi |pipe
:
this happens | then this | { then ; all of ; this too ; } | before this
Tất cả các quy trình đó được gọi cùng một lúc - nhưng tất cả chúng đều chờ đợi |pipe
trước khi chúng thực sự làm bất cứ điều gì - miễn là chúng đọc được |pipe
tất cả, đó là. Vì vậy, nếu bạn cần đánh giá một dòng giữa biến hoặc để thiết lập chuyển hướng, bạn có thể. Chỉ cần dành thời gian của bạn.
echo "it takes time" |
{ exec 4>|file ; cat >&4 ; } |
( sleep 1 && cat <file )
it takes time
Đây là một cách khác:
echo "more of the same" |
( IFS= ; su -mc 'echo '"$(printf "'%s' " "`cat`")"' >|file' </dev/tty ) |
echo end of pipe
Nếu bạn không ( subshell )
nhận lệnh $(cat)
cũng sẽ nhận được </dev/tty
.
Nhưng nếu bạn đang sử dụng tài liệu ở đây, bạn không cần hai 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
ĐẦU RA:
this is the beginning
of the pipeline
Password:
middle here
this is the end
of the pipeline
Hầu hết các bên trên chỉ là để demo này. Tất cả những gì bạn thực sự cần là:
su -c 'cat <&3 >./file' 3<<HERE | { wait as needed ; more stuff to do ; }
$(echo "something" | and other things)
HERE