Làm thế nào để chạy một phần của tập lệnh với các đặc quyền giảm?


7

Tôi có một vấn đề sau: Trên mỗi máy chạy Postgresql đều có một postgres người dùng đặc biệt . Người dùng này có quyền truy cập quản trị vào máy chủ cơ sở dữ liệu.

Bây giờ tôi muốn viết một tập lệnh Bash thực thi một lệnh cơ sở dữ liệu với psql là các postgres của người dùng (psql sẽ thực thi như các postgres của người dùng , không phải là script). Cho đến nay, đó sẽ không phải là vấn đề: tôi chỉ có thể chạy tập lệnh dưới dạng postgres của người dùng .

Tuy nhiên, tôi muốn ghi đầu ra của psql vào một tệp trong thư mục mà postgres không có quyền ghi.

Làm thế nào tôi có thể làm điều đó?

Tuy nhiên, tôi đã nghĩ về việc thay đổi EUID trong tập lệnh:

  1. Tôi không thể tìm cách thay đổi EUID trong tập lệnh Bash
  2. Làm cách nào tôi có thể thay đổi EUID khi sử dụng một cái gì đó như thế
    psql -U postgres -c "<command>" > filenào?

làm cách nào tôi có thể thay đổi người dùng postgres mật khẩu trong subshell (su -c 'psql -U postgres -c "ALTER USER forip PASSWORD \' password \ ';"' postgres)
Fndiaz

Câu trả lời:


5

Sử dụng một lớp con: (su -c 'psql -U postgres -c "<command>"' postgres) > file

Bên trong lớp con, bạn có thể thả quyền để thực hiện công việc của mình, nhưng đầu ra được chuyển hướng đến vỏ ban đầu vẫn có quyền ban đầu của bạn.


5

Bạn có thể muốn sử dụng thủ thuật này:

{ anycommand } | su -c 'tee file' user

tee(1) là tiện ích POSIX, vì vậy bạn có thể dựa vào tính khả dụng của nó.


Hoặc, với sudo:

{ anycommand } | sudo -u user 'tee file'

Cảm ơn ý kiến ​​của bạn. Tuy nhiên, tôi đang gặp phải hai vấn đề: su không có tùy chọn -u, ít nhất là trên máy của tôi. Chạy nó một cách chính xác (người dùng lệnh su -c) dẫn đến một vấn đề khác, đó là su phải được chạy từ một thiết bị đầu cuối. Dù sao thì nó cũng có thể không hoạt động vì su sẽ mở một subshell mới bằng lệnh đó.

@Legate bạn có sudo trên hệ thống của bạn?
ulidtko

@ulidtko: Vâng, tôi có.

1
sau đó chỉ cần sử dụng sudo -u postgres psql -c '...' > filevà chỉnh sửa sudoers để tắt lời nhắc mật khẩu cho lệnh này
gelraen

1

Bạn có thể chạy tập lệnh shell với người dùng có quyền ghi tốt hơn (chẳng hạn như root) và khi bạn xuất dữ liệu nên ghi vào thư mục mà người dùng cơ sở dữ liệu có thể ghi vào (chẳng hạn như / tmp)

sau khi ghi xong dữ liệu, hãy chuyển nó vào thư mục mà tập lệnh shell của bạn có quyền ghi (như người dùng root có thể viết ở bất cứ đâu)


0

Nếu bạn đang nghĩ ra những cách khó để phá vỡ các hạn chế bảo mật, tốt nhất bạn nên tự hỏi liệu mục tiêu của bạn có thực sự khôn ngoan hay không. Tôi không biết gì về postgresql - bạn có thực sự cần phải đăng nhập bằng tài khoản quản trị để làm những gì bạn đang cố gắng không, hoặc có cách nào bạn có thể cấp quyền chỉ đọc cho bất kỳ tài khoản người dùng thông thường nào không?


Cảm ơn bạn vì câu trả lời. Tuy nhiên, không có vấn đề gì trong việc chạy tập lệnh với quyền root, do đó không có sự hạn chế nào về các hạn chế bảo mật xảy ra.

0

Tại sao bạn không làm như thế này : sudo su postgres -c "psql ..." >/path/to/file?


Cảm ơn bạn đã trả lời. Tuy nhiên, một thử nghiệm nhanh với sudo su postgres -c "echo test"tiết lộ rằng một lệnh như vậy không in bất cứ điều gì. Chuyển sang root bằng sudo -svà sau đó thực hiện kiểm trasu postgres -c "echo test" in , vì vậy có vẻ như đó là bằng cách nào đó ăn đầu ra. Mặc dù vậy, tôi không biết tại sao, tôi đoán là vậy và sử dụng các lớp con mà thiết bị xuất chuẩn không bị kéo vào vỏ của chính tôi. sudosudosu -c
Christoph Wurm

Bạn phải thiếu một cái gì đó. sudo su postgres -c "echo \$USER"in postgrestrên hộp của tôi.
alex

Chà, nó hoạt động trên máy tính xách tay Ubuntu của tôi, nhưng không phải trên máy chủ Debian nơi tập lệnh phải chạy.
Christoph Wurm
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.