Làm thế nào để tôi nâng cao đặc quyền ở giữa đường ống?


8

Tôi đoán là như sau:

echo "Generating some text" | su - -c cat >/output/file

Nhưng sunói:

su: must be run from a terminal

Bạn sẽ làm gì?


Nếu bạn tìm thấy một giải pháp cho mình, xin vui lòng thêm nó như câu trả lời dưới đây.
Braiam

@Braiam Giải pháp không xứng đáng là một câu trả lời.
x-yuri

Câu trả lời:


8

sudo hỗ trợ này

$ echo hello world | sudo cat  
SUDO password: 
hello world

Sự khác biệt là sudoyê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( runaspwhoặ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/filesẽ 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/filevà 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ì teetiện ích sẽ tự mở tệp.

echo "hello world" | sudo tee /output/file >/dev/null

Về cơ teebản sao chép đầu ra vào /output/filevà 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.


Bạn cũng có thể "lưu trữ" các đặc quyền nâng cao bằng cách gọi 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.
Winny

2

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 |pipetrước khi chúng thực sự làm bất cứ điều gì - miễn là chúng đọc được |pipetấ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 cats:

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

Tôi biết điều đó. Điều đó có ít hoặc không có gì để làm với câu hỏi, hoặc tôi nghĩ vậy. Nhưng bằng cách nào đó nó đã dẫn tôi đến một câu trả lời :) Xem câu hỏi cập nhật của tôi.
x-yuri

@ x-yuri Bạn vẫn có thể đặt tài liệu ở đây vào giữa đường ống. lặp lại một cái gì đó | {su 'làm một số thứ> /record.here'; } << TẠI ĐÂY | tiếng vang cuối đường ống \ n $ (con mèo) \ nHERE \ n
mikeerv

Thật vậy, tôi đã không nghĩ đến việc sử dụng con mèo trong tài liệu này. Dù sao, bạn không cần phải nhóm ở đó.
x-yuri

@ x-yuri - điều đó phụ thuộc vào những gì bạn muốn làm với nó. Bạn có thể sử dụng một hoặc cả hai. Tôi chỉ cố gắng chứng minh bạn có lựa chọn. Câu trả lời của Patrick là câu trả lời đúng ở đây, đây chỉ là một cách khác, phức tạp hơn. Tuy nhiên, đây là tài liệu nhóm, nó nhóm mèo trong một mạng con.
mikeerv

Bằng cách nhóm tôi có nghĩa là niềng răng xoăn .
x-yuri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.