Câu trả lời:
Vấn đề là sudo -s
khô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--
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 sudo
thay thế. Nó không phải là một ý tưởng rất tốt để có sudo
trong 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
Các Bourne shell có một -c
lá 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 something
là 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_script
có 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_script
sau đó 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 -d
cờ để giải mã, được hỗ trợ ít hơn so với --decode
biến thể dài dòng . Một số triển khai yêu cầu thêm một -w 0
lệnh mã hóa để tránh ngắt dòng giả.
sudo -s
chỉ trong trường hợproot
người dùng có ý tưởng (khá nghèo) để thay đổi vỏ của nó. Điều này thực sự nên đượcsudo sh
nêu rõ ràng vỏ nào sẽ được sử dụng.