Bash, thực thi lệnh sau khi gọi shell mới


12

Tôi đang cố gắng tạo ra một kịch bản như thế này:

#!/bin/bash
sudo -s
something...

Khi tôi thực thi nó, tôi nhận được một shell mới nhưng chỉ somethingđược thực thi khi tôi thoát khỏi shell được tạo bởi sudo -s, không phải bên trong nó.

Có ai giúp đỡ không?

Câu trả lời:


7

Vấn đề là sudo -skhông có bất kỳ đối số nào sẽ mở một vỏ tương tác cho root.

Nếu bạn chỉ muốn chạy một lệnh bằng cách sử dụng sudo -s, bạn có thể thực hiện đơn giản:

sudo -s command

Ví dụ :

$ sudo -s whoami
root

Hoặc bạn có thể sử dụng chuỗi ở đây:

$ sudo -s <<<'whoami'
root

Nếu bạn có nhiều lệnh, bạn có thể sử dụng tài liệu ở đây:

$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--

1
Nó không tốt để sử dụng sudo -schỉ trong trường hợp rootngười dùng có ý tưởng (khá nghèo) để thay đổi vỏ của nó. Điều này thực sự nên được sudo shnêu rõ ràng vỏ nào sẽ được sử dụng.
Michael Le Barbier Grünewald

7

Một cách khác là truyền một lệnh bash đầy đủ cho sudo:

#!/bin/bash
sudo bash -c 'command1; command2; command3;'

Tuy nhiên, một cách tốt hơn sẽ được khởi động kịch bản với sudothay thế. Nó không phải là một ý tưởng rất tốt để có sudotrong kịch bản. Tốt hơn nhiều để chạy toàn bộ tập lệnh với quyền root ( sudo script.sh). Nếu cần, bạn có thể sử dụng sudođể thả đặc quyền cho các lệnh cụ thể. Ví dụ:

#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami  ## drop privileges for specific command.

Chạy đoạn script trên trả về:

$ sudo ~/scripts/a.sh
root
/root
terdon

3

Các Bourne shell có một -clá cờ mà bạn có thể sử dụng để vượt qua một kịch bản tùy ý để vỏ, do đó bạn có thể viết một cái gì đó như

sudo sh -c 'something'

Tuy nhiên, điều này chỉ hữu ích cho các lệnh đơn giản nhất, vì rất khó để trích dẫn chính xác tập lệnh và sự bất tiện thậm chí còn cao hơn nếu bạn gửi lệnh đến máy chủ từ xa qua ssh vì tập lệnh đối số sẽ được phân tích hai lần, một lần ở bên gửi tập lệnh và một lần ở bên chạy tập lệnh.

Nếu somethinglà một tập lệnh phức tạp hoặc cần được truyền qua một dòng ssh , thì thông thường là viết một hàm prepare_something_scriptcó công việc là viết tập lệnh 'cái gì đó' trên thiết bị xuất chuẩn . Ở dạng đơn giản nhất, chức năng này có thể sử dụng tài liệu ở đây để tạo đầu ra của nó:

prepare_something_script()
{
  cat <<EOF
something
EOF
}

Tập lệnh được tạo bởi prepare_something_scriptsau đó có thể được thực thi cục bộ với các đặc quyền được cấp bởi sudo như sau:

prepare_something_script | sudo sh

Trong kịch bản mà tập lệnh phải được thực thi từ xa với các đặc quyền được cấp bởi sudo , theo thông lệ, mã hóa tập lệnh trong cơ sở 64 để tránh chuyển hướng đầu vào tiêu chuẩn của ssh , như sau:

something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"

Nếu bạn sử dụng mã mà trong một chức năng, đừng quên để đánh dấu something64 biến như địa phương . Một số triển khai của Base64 cung cấp một -dcờ để giải mã, được hỗ trợ ít hơn so với --decodebiến thể dài dòng . Một số triển khai yêu cầu thêm một -w 0lệnh mã hóa để tránh ngắt dòng giả.


0

Bạn cần thêm lệnh trước sudo -s, thay vì trong dòng tiếp theo.

sudo -s something...
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.