แก้ไขไฟล์ผ่านสคริปต์ทุบตี


12

ฉันเป็นผู้เริ่มต้นในสคริปต์ทุบตีฉันต้องการสร้างสคริปต์ทุบตีเพื่อติดตั้งและกำหนดค่าเนื้อหาในกล่อง Linux ของฉันในวิธีอัตโนมัติ

สมมติว่าฉันต้องการแก้ไข

/etc/yum.repos.d/epel.repo

โดยสคริปต์ทุบตี

สิ่งที่ฉันอยากทำมีดังนี้

  1. เปิดไฟล์ /etc/yum.repos.d/epel.repo
  2. ค้นหาส่วน [epel]
  3. เพิ่มลำดับความสำคัญของบรรทัด = 10 หลังจากเปิดใช้งานบรรทัด = 1 ในส่วน epel

สำหรับส่วนแรกฉันเพิ่ม

yum install nano
nano /etc/yum.repos.d/epel.repo

คำถามของฉันคือวิธีการทำส่วนที่ 2 และ 3 ด้วยสคริปต์ทุบตีโดยใช้นาโน (ถ้าเป็นไปได้ในกรณีที่เป็นไปไม่ได้จากนั้นแสดงด้วย sed)

นอกจากนี้ในบางจุดฉันจะต้องแก้ไขตัวแปรในไฟล์เช่น

  1. เปิดใช้งาน = 0 เพื่อเปิดใช้งาน = 1
  2. การทดสอบ = "1" ถึงการทดสอบ = "0"
  3. เพิ่มข้อความในบรรทัด ฟังก์ชั่น = เพื่อฟังก์ชั่น = "text1", "text2"
  4. เพิ่มข้อความลงในไฟล์และบันทึก (ด้วย nano)

ฉันรู้ว่ามันมีความต้องการ แต่ฉันจำเป็นต้องสร้างสิ่งนี้ให้กับเพื่อนที่เป็น noob ในการจัดการเซิร์ฟเวอร์โชคไม่ดีที่ฉันไม่มีเวลาศึกษาการใช้สคริปต์ bash ตั้งแต่เริ่มต้นเนื่องจากการสอบของฉันใกล้เข้ามาฉันจะใช้ตัวอย่างของคุณเขียนสคริปต์


คนขอบคุณสำหรับการตอบกลับทั้งหมดที่ฉันได้ทำสคริปต์ทุบตีสำเร็จเป็นส่วนใหญ่

อย่างไรก็ตามฉันมีปัญหาอื่นให้สมมติว่าฉันต้องการแก้ไข nginx.conf โดยใช้ sed เราจะจัดการกับ worker_processes
ตอนนี้ฉันต้องการใช้ sed เพื่อทำสิ่งต่อไปนี้ 1. ค้นหาการเกิดขึ้นครั้งแรกของ worker_processes conf และแทนที่ข้อความด้วยworker_processes 4;

หมายเหตุพิเศษที่นี่: นี่เป็นเพียงตัวอย่าง มันอาจเกิดขึ้นได้ว่า conf มี worker_processes 1; . นี่เป็นส่วนที่ยาก ฉันต้องการคำสั่ง sed ที่ค้นหากรณีการจับคู่ครั้งแรกของ word worker_processesลบบรรทัดข้อความที่พบคำนั้นและวางที่ worker_processes 4;นั่นแล้วบันทึกไฟล์ นี่เป็นวิธีที่เชื่อถือได้มากที่สุดเมื่อฉันแก้ไขไฟล์ (โดยไม่เสี่ยงต่อการเกิดข้อผิดพลาดใด ๆ

หนึ่งคำแนะนำสุดท้ายที่ฉันใช้ sed -i 's / enabled = 0 / enabled = 1 / g' /etc/yum.repos.d/remi.repo เพื่อเปลี่ยน enable = 0 เป็น enable = 1 ภายใต้ส่วน [remi] ใน remi .repo. อย่างไรก็ตามฉันมีความรู้สึกว่ามันอาจแก้ไขการเปิดใช้งานทั้งหมด = 0 ในไฟล์นั้นซึ่งจะสร้างความเสียหายให้กับเซิร์ฟเวอร์ทุกคนสามารถแนะนำรหัสที่ดีกว่า


สิ่งอื่นที่ฉันไม่แน่ใจ: PI ต้องการแก้ไขไฟล์ที่มีสิ่งนี้เป็น Text Testing = "0" (ใช่มันมีเครื่องหมายคำพูดและฉันจำเป็นต้องเก็บไว้) มันควรได้รับการแก้ไขจากการทดสอบ = "0" ถึงการทดสอบ = " 1 "(พร้อมเครื่องหมายคำพูด)

นอกจากนี้ฉันต้องเพิ่มข้อความด้วยเครื่องหมายคำพูดท้ายไฟล์ด้วย sed เช่น "Thanks Quanta" (พร้อมเครื่องหมายอัญประกาศ) สำหรับ php คุณใส่ a ด้วยเครื่องหมายคำพูดสะท้อนไม่ทราบว่าทำอย่างไรเพื่อทุบตี

อีกสิ่งหนึ่งที่
ฉันต้องแก้ไขในบรรทัด conf แต่ฉันจำไม่ได้ว่าอะไรคือสิ่งที่แทนที่ข้อความทั้งหมด

ชอบฟัง = บางสิ่ง; ฉันต้องการแก้ไขเพื่อฟัง = /tmp/php5-fpm.sock;

นิ้วโป้งขนาดใหญ่ขึ้นสำหรับควอนตัม

ขอบคุณสำหรับการสนับสนุนที่ยอดเยี่ยม

คำตอบ:


18
sed '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

ระบุตัวเลือกการแก้ไขแบบแทนที่ ( -i) หากคุณต้องการ (ทำการสำรองข้อมูลด้วย.bakนามสกุลก่อน):

sed -i.bak '/enabled=1/a\priority=10' /etc/yum.repos.d/epel.repo

ตอนนี้ฉันต้องการใช้ sed เพื่อทำสิ่งต่อไปนี้ 1. หาการเกิดขึ้นเป็นครั้งแรกของ worker_processes ใน conf และแทนที่ข้อความด้วย worker_processes 4;

sed '0,/worker_processes [0-9]*;/s//worker_processes 4;/' /etc/nginx/nginx.conf

หนึ่งที่ผมเสนอแนะที่ผ่านมาใช้ sed -i 's/enabled=0/enabled=1/g' /etc/yum.repos.d/remi.repoกับการเปลี่ยนแปลงenabled=0ที่จะenabled=1อยู่ภายใต้ ส่วนใน[remi] remi.repoอย่างไรก็ตามฉันมีความรู้สึกว่ามันอาจแก้ไขทั้งหมดenabled=0ในไฟล์นั้นซึ่งจะสร้างความเสียหายให้เซิร์ฟเวอร์ทุกคนสามารถแนะนำรหัสที่ดีกว่า

นี่สำหรับคุณ:

sed '/\[remi\]/,/enabled=0/ { s/enabled=0/enabled=1/ }' remi.repo

สิ่งอื่นที่ฉันไม่แน่ใจ: PI ต้องการแก้ไขไฟล์ที่มีสิ่งนี้เป็น Text Testing = "0" (ใช่มันมีเครื่องหมายคำพูดและฉันต้องการเก็บไว้) มันควรได้รับการแก้ไขจากการทดสอบ = "0" ถึงการทดสอบ = " 1 "(พร้อมเครื่องหมายคำพูด)

sed 's/Testing = "0"/Testing = "1"/g'

นอกจากนี้ฉันต้องเพิ่มข้อความด้วยเครื่องหมายคำพูดท้ายไฟล์ด้วย sed เช่น "Thanks Quanta" (พร้อมเครื่องหมายอัญประกาศ) สำหรับ php คุณใส่ a ด้วยเครื่องหมายคำพูดสะท้อนไม่ทราบว่าทำอย่างไรเพื่อทุบตี

sed '$a"Werulz, you are welcome"\'

อีกสิ่งหนึ่งที่ฉันจำเป็นต้องแก้ไขบรรทัดใน conf แต่ฉันจำไม่ได้ว่าสิ่งที่เป็นข้อความทั้งหมดเพื่อแทนที่

ชอบฟัง = บางสิ่ง; ฉันต้องการแก้ไขเพื่อฟัง = /tmp/php5-fpm.sock;

sed 's/listen = .*/listen = \/tmp\/php5-fpm.sock;/'

'sed' / enabled = 1 / a \ priority = 10 '/etc/yum.repos.d/epel.repo' จะแก้ไขไฟล์และบันทึกการเปลี่ยนแปลงเลิกยืนยัน
Werulz

@Werulz: เพียงตรวจสอบกับไฟล์ที่ไม่สำคัญหรือคัดลอกเนื้อหาของ epel.repo ไปยังไฟล์ในโฮมไดเร็กตอรี่แล้วลองเรียกใช้ที่นั่นโดยไม่ได้รับสิทธิ์ root / superuser
เอริคฉัน

-iไม่ได้เป็นตัวเลือกมาตรฐานsedสำหรับ edอย่างไรก็ตามมีวิธีที่เป็นไปตามมาตรฐานในการแก้ไขไฟล์ที่มีไวยากรณ์คล้ายกับของ sed
kojiro

ฉันอัปเดตโพสต์แรกเพื่อขอคำแนะนำอีกครั้งขอบคุณมากสำหรับการสนับสนุนควอนตั้ม
Werulz

ฉันอัปเดตโพสต์อีกครั้ง ...... ขอโทษที่ถามคำถามมากมาย จะแชร์สคริปต์กับคุณในกรณีที่คุณต้องการ
Werulz

12

เช่นเดียวกับ ptman กล่าวว่าAugeasสามารถช่วยให้คุณประหยัดจากการใช้sed/ awk:

$ augtool -s set /files/etc/yum.repos.d/epel.repo/epel/priority 10

จะตั้งค่าลำดับความสำคัญของepelพื้นที่เก็บข้อมูลเป็น 10 หากpriorityคีย์มีอยู่แล้วมันจะตั้งค่ามิฉะนั้นจะเพิ่มpriorityรายการหลังจากรายการสุดท้ายในส่วน

เช่นเดียวกันกับค่าอื่น ๆ ที่คุณอาจต้องการแก้ไข

หากคุณต้องการแก้ไขค่าหลายค่าคุณสามารถใช้augtoolเป็นล่ามได้ด้วย:

$ cat epel.augtool
#!/usr/bin/augtool -sf

# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
$ chmod +x epel.augtool
$ ./epel.augtool
Saved 1 file(s)

หากคุณต้องการเก็บไว้ใน bash script คุณสามารถไพพ์คำสั่งลงในaugtool:

cat <<EOF | augtool
# Make a variable
defvar epel /files/etc/yum.repos.d/epel.repo/epel

# Set values
set $epel/enable 1
set $epel/priority 10
set $epel/Testing 0
save
EOF

ดูman augtoolตัวเลือกเพิ่มเติม

มีข้อดีหลายประการในการใช้ Augeas vs sed/ awk:

  • Augeas มีตัวแยกวิเคราะห์ที่รู้เกี่ยวกับไวยากรณ์ของไฟล์ (ในกรณีนี้คือyum.repoไวยากรณ์) คุณจะไม่เสี่ยงที่จะทำลายไวยากรณ์ไฟล์ถ้า regex ของคุณผิด
  • ตัวแยกวิเคราะห์ Augeas yum.repo รู้เกี่ยวกับyum.repoส่วนต่างๆดังนั้นคุณจึงรู้ว่าคุณกำลังแก้ไขส่วนที่ถูกต้อง
  • Augeas เป็น idempotent มันจะทำการเปลี่ยนแปลงไฟล์เท่านั้นหากมีการเปลี่ยนแปลงที่จะทำ หากตั้งค่าทั้งหมดแล้วจะไม่แก้ไขไฟล์
  • Augeas มีผู้ให้บริการหุ่นกระบอกดังนั้นคุณจึงสามารถทำสิ่งนี้โดยอัตโนมัติในโครงสร้างพื้นฐานของ Puppet
  • ถ้าพารามิเตอร์ยังไม่มีอยู่ Augeas จะสร้างพารามิเตอร์ให้คุณ หากส่วนยังไม่มีอยู่ Augeas ก็จะสร้างมันขึ้นมาพร้อมกับไวยากรณ์ที่เหมาะสม

ขอบคุณสำหรับการตอบกลับ ...... จะพิจารณาอย่างแน่นอน .... คุณช่วยยกตัวอย่างวิธีใช้กับสคริปต์ทุบตีของฉันได้ไหม
Werulz

ตกลงดูการแก้ไขของฉัน
ℝaphink

2

คุณอาจต้องการตรวจสอบAugeasซึ่งเป็นเครื่องมือสำหรับปรับเปลี่ยนไฟล์ปรับแต่งทางโปรแกรม มันมีประสิทธิภาพมากเมื่อใช้ร่วมกับPuppet (ระบบจัดการการกำหนดค่า) แต่สามารถใช้งานได้ด้วยตัวเอง


ฮ่า ๆ นั่นคืออะไร
Werulz

2
คุณสามารถปรับปรุงคุณภาพของคำตอบนี้โดยการให้คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่ Augeas ทำ / ทำและโดยการเพิ่มตัวอย่างหนึ่งหรือสองตัวอย่าง
ThatGraemeGuy

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