Bash รันคำสั่งหลังจากเรียกใช้เชลล์ใหม่


12

ฉันพยายามสร้างสคริปต์เช่นนี้:

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

เมื่อฉันรันมันฉันจะได้เชลล์ใหม่ แต่somethingจะถูกรันก็ต่อเมื่อฉันออกจากเชลล์ที่สร้างขึ้นโดยsudo -sไม่ได้อยู่ข้างใน

ความช่วยเหลือใด ๆ

คำตอบ:


7

ปัญหาคือsudo -sไม่มีข้อโต้แย้งใด ๆ จะเปิดเปลือกโต้ตอบสำหรับรูท

หากคุณต้องการรันคำสั่งเดียวโดยใช้sudo -sคุณสามารถทำได้โดยง่าย:

sudo -s command

ตัวอย่างเช่น :

$ sudo -s whoami
root

หรือคุณสามารถใช้สตริงที่นี่:

$ sudo -s <<<'whoami'
root

หากคุณมีหลายคำสั่งคุณสามารถใช้ที่นี่ doc:

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

1
ไม่ควรใช้sudo -sในกรณีที่rootผู้ใช้มีความคิด (ค่อนข้างแย่) ในการเปลี่ยนเชลล์ นี่ควรเป็นsudo shสิ่งที่ระบุอย่างชัดเจนว่าจะใช้เชลล์ใด
Michael Le Barbier Grünewald

7

อีกวิธีคือส่งคำสั่ง 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

3

บอร์นเปลือกมี-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คำสั่งการเข้ารหัสเพื่อหลีกเลี่ยงการแบ่งบรรทัดเก๊


0

คุณต้องเพิ่มคำสั่งล่วงหน้าของ sudo -s แทนที่จะเป็นในบรรทัดถัดไป

sudo -s something...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.