ฉันพยายามสร้างสคริปต์เช่นนี้:
#!/bin/bash
sudo -s
something...
เมื่อฉันรันมันฉันจะได้เชลล์ใหม่ แต่something
จะถูกรันก็ต่อเมื่อฉันออกจากเชลล์ที่สร้างขึ้นโดยsudo -s
ไม่ได้อยู่ข้างใน
ความช่วยเหลือใด ๆ
ฉันพยายามสร้างสคริปต์เช่นนี้:
#!/bin/bash
sudo -s
something...
เมื่อฉันรันมันฉันจะได้เชลล์ใหม่ แต่something
จะถูกรันก็ต่อเมื่อฉันออกจากเชลล์ที่สร้างขึ้นโดยsudo -s
ไม่ได้อยู่ข้างใน
ความช่วยเหลือใด ๆ
คำตอบ:
ปัญหาคือsudo -s
ไม่มีข้อโต้แย้งใด ๆ จะเปิดเปลือกโต้ตอบสำหรับรูท
หากคุณต้องการรันคำสั่งเดียวโดยใช้sudo -s
คุณสามารถทำได้โดยง่าย:
sudo -s command
ตัวอย่างเช่น :
$ sudo -s whoami
root
หรือคุณสามารถใช้สตริงที่นี่:
$ sudo -s <<<'whoami'
root
หากคุณมีหลายคำสั่งคุณสามารถใช้ที่นี่ doc:
$ sudo -s <<'EOF'
> whoami
> hostname
> EOF
root
something--
อีกวิธีคือส่งคำสั่ง bash แบบเต็มไปที่sudo
:
#!/bin/bash
sudo bash -c 'command1; command2; command3;'
อย่างไรก็ตามวิธีที่ดีกว่าคือการเปิดสคริปต์ด้วยsudo
แทน ไม่ใช่ความคิดที่ดีที่จะมีsudo
อยู่ในสคริปต์ ดีกว่ามากในการเรียกใช้สคริปต์ทั้งหมดด้วยสิทธิ์ของรูต ( sudo script.sh
) หากจำเป็นคุณสามารถใช้sudo
เพื่อยกเลิกสิทธิ์สำหรับคำสั่งเฉพาะ ตัวอย่างเช่น:
#!/usr/bin/env bash
whoami
echo $HOME
sudo -u terdon whoami ## drop privileges for specific command.
การเรียกใช้สคริปต์ด้านบนส่งคืน:
$ sudo ~/scripts/a.sh
root
/root
terdon
บอร์นเปลือกมี-c
ธงซึ่งคุณสามารถใช้ในการส่งผ่านสคริปต์พลไปยังเปลือกเพื่อให้คุณสามารถเขียนสิ่งที่ต้องการ
sudo sh -c 'something'
อย่างไรก็ตามสิ่งนี้มีประโยชน์สำหรับคำสั่งที่ง่ายที่สุดเพราะมันยุ่งยากมากในการอ้างอิงสคริปต์อย่างถูกต้องและความไม่สะดวกจะสูงขึ้นหากคุณส่งคำสั่งไปยังเซิร์ฟเวอร์ระยะไกลบนsshเพราะสคริปต์อาร์กิวเมนต์จะถูกวิเคราะห์สองครั้งที่ด้านข้าง ส่งสคริปต์และครั้งเดียวในด้านการเรียกใช้สคริปต์
ถ้าsomething
เป็นสคริปต์ที่ซับซ้อนหรือความต้องการที่จะถูกส่งผ่านไปกว่าSSHสายมันเป็นเรื่องธรรมดาที่จะเขียนฟังก์ชั่นprepare_something_script
ที่มีหน้าที่คือการเขียนสคริปต์ 'บางสิ่งบางอย่างเกี่ยวกับstdout ในรูปแบบที่ง่ายที่สุดฟังก์ชั่นนี้สามารถใช้ here-document เพื่อสร้างผลลัพธ์:
prepare_something_script()
{
cat <<EOF
something
EOF
}
สคริปต์ที่สร้างโดยprepare_something_script
สามารถเรียกใช้งานแบบโลคัลโดยใช้สิทธิ์ที่sudoดังนี้
prepare_something_script | sudo sh
ในสถานการณ์ที่สคริปต์จะต้องดำเนินการจากระยะไกลด้วยสิทธิ์ที่ได้รับจากsudoมันเป็นธรรมเนียมในการเข้ารหัสสคริปต์ในฐาน 64 เพื่อหลีกเลี่ยงการเปลี่ยนเส้นทางอินพุตมาตรฐานของsshดังนี้:
something64=$(prepare_something_script | base64)
ssh usesr@remote-host "echo ${something64} | base64 --decode | sudo sh"
หากคุณใช้รหัสว่าในฟังก์ชั่นไม่ลืมที่จะทำเครื่องหมายsomething64ตัวแปรท้องถิ่น การใช้งานบางอย่างของbase64มีการ-d
ตั้งค่าสถานะให้ถอดรหัสซึ่งได้รับการสนับสนุนน้อยกว่า--decode
ตัวแปรverbose การใช้งานบางอย่างจำเป็นต้องเพิ่ม-w 0
คำสั่งการเข้ารหัสเพื่อหลีกเลี่ยงการแบ่งบรรทัดเก๊
คุณต้องเพิ่มคำสั่งล่วงหน้าของ sudo -s แทนที่จะเป็นในบรรทัดถัดไป
sudo -s something...
sudo -s
ในกรณีที่root
ผู้ใช้มีความคิด (ค่อนข้างแย่) ในการเปลี่ยนเชลล์ นี่ควรเป็นsudo sh
สิ่งที่ระบุอย่างชัดเจนว่าจะใช้เชลล์ใด