คำถามติดแท็ก bash

Bash คือ Bourne Again SHell ผู้สืบทอดมาจาก Unix sh (shell) คลาสสิก

5
วิธีที่สะอาดในการเขียนสตริงหลายบรรทัดที่ซับซ้อนไปยังตัวแปร
ฉันต้องเขียน xml เชิงซ้อนบางตัวไปยังตัวแปรที่อยู่ในสคริปต์ทุบตี xml ต้องสามารถอ่านได้ในสคริปต์ทุบตีเนื่องจากนี่คือที่ที่ส่วนย่อยของ xml จะอยู่ไม่ได้อ่านจากไฟล์หรือแหล่งข้อมูลอื่น ดังนั้นคำถามของฉันคือถ้าฉันมีสายยาวที่ฉันต้องการให้มนุษย์อ่านในสคริปต์ทุบตีของฉันวิธีที่ดีที่สุดที่จะไปเกี่ยวกับมันคืออะไร? เป็นการดีที่ฉันต้องการ: เพื่อไม่ต้องหนีจากตัวละครใด ๆ มีมันข้ามหลายบรรทัดทำให้มนุษย์อ่านได้ ให้มันเยื้อง สิ่งนี้สามารถทำได้ด้วย EOF หรือบางสิ่งบางอย่างใครสามารถยกตัวอย่างให้ฉันได้บ้าง เช่น String = <<EOF <?xml version="1.0" encoding='UTF-8'?> <painting> <img src="madonna.jpg" alt='Foligno Madonna, by Raphael'/> <caption>This is Raphael's "Foligno" Madonna, painted in <date>1511</date>-<date>1512</date>.</caption> </painting> EOF
109 bash 


16
วิธีที่ดีที่สุดในการตรวจสอบว่าติดตั้งไดรฟ์ข้อมูลในสคริปต์ Bash อย่างไร
วิธีที่ดีที่สุดในการตรวจสอบว่าติดตั้งไดรฟ์ข้อมูลในสคริปต์ Bash อย่างไร สิ่งที่ฉันชอบจริงๆคือวิธีการที่ฉันสามารถใช้สิ่งนี้: if <something is mounted at /mnt/foo> then <Do some stuff> else <Do some different stuff> fi
103 linux  bash  mount 

13
วิธีเพิ่มการประทับเวลาเพื่อบันทึกสคริปต์ทุบตี?
ฉันมีสคริปต์ที่ทำงานอยู่ตลอดเวลาที่ฉันส่งออกไปยังล็อกไฟล์: script.sh >> /var/log/logfile ฉันต้องการเพิ่มการประทับเวลาก่อนแต่ละบรรทัดที่ผนวกเข้ากับบันทึก ชอบ: Sat Sep 10 21:33:06 UTC 2011 The server has booted up. Hmmph. มีศิลปป้องกันตัวแบบหนึ่งที่ฉันสามารถใช้?
94 linux  bash  logging  shell 

9
mysqldump เป็น tar.gz
โดยปกติหลังจากทิ้งฐานข้อมูล MySQL ด้วยmysqldumpคำสั่งฉันทันที tar / gzip ไฟล์ผลลัพธ์ ฉันกำลังมองหาวิธีการทำสิ่งนี้ในคำสั่งเดียว: ดังนั้นจากนี้ mysqldump dbname -u root -p > dbname.sql tar czvf dbname.sql.tgz dbname.sql rm dbname.sql เพื่อสิ่งนี้: mysqldump dbname -u root -p > some wizardry > dbname.sql.tgz หรือดียิ่งขึ้น (เนื่องจากฉันมักจะสแกนไฟล์การถ่ายโอนไปยังเซิร์ฟเวอร์อื่น): mysqldump dbname -u root -p > send dbname.sql.tgz to user@host ฉันกำลังทุบตีกับเดเบียน
88 mysql  debian  bash  gzip  tar 

8
วิธีสร้างสคริปต์ทุบตีพิมพ์ทุกคำสั่งก่อนที่จะดำเนินการ?
ตัวอย่างเช่นฉันมีไฟล์ทุบตีง่าย #!/bin/bash cd ~/hello ls ฉันจะทำให้มันแสดงทุกคำสั่งก่อนดำเนินการได้อย่างไร เพียงผลตรงข้ามของ "@echo off" ในการเขียนสคริปต์ชุด windows

7
เรียกใช้สคริปต์ในฐานะผู้ใช้ที่มีเปลือก nologin
ทั้งหมดที่ฉันต้องทำคือการใช้สคริปต์เฉพาะเป็นผู้ใช้โดยเฉพาะอย่างยิ่งคนที่ไม่ได้มีเปลือกที่ระบุไว้ในnologin/false/etc/passwd ฉันจะเรียกใช้สคริปต์ในฐานะรูทและควรเรียกใช้ในฐานะผู้ใช้รายอื่น วิ่ง: ~# su -c "/bin/touch /tmp/test" testuser จะใช้งานได้ แต่ฉันต้องการเชลล์ที่ถูกต้องสำหรับ testuser ฉันรู้ว่าฉันสามารถปิดการใช้งานรหัสผ่านด้วยpasswd -d testuserและปล่อยเปลือก/bin/bashด้วยวิธีนี้จะปลอดภัยเล็กน้อย แต่ฉันต้องมีnologin/falseเปลือก โดยทั่วไปสิ่งที่ฉันต้องการคือสิ่งที่crontabจะเกิดขึ้นเมื่อเราตั้งค่างานให้ทำงานในฐานะผู้ใช้เฉพาะไม่ว่าจะมีงานnologin/falseเชลล์ ps ฉันพบกระทู้นี้รันคำสั่งในฐานะผู้ใช้ nologinแต่ฉันไม่รู้ว่าจะconcatenateใช้คำสั่งsu -s /bin/sh $userไปยังสคริปต์ที่ฉันต้องใช้อย่างไร
87 linux  bash  shell  su  login 

7
เรียกใช้เชลล์ย่อย bash เชิงโต้ตอบด้วยคำสั่งเริ่มต้นโดยไม่ต้องกลับไปที่เปลือก (“ super”) ทันที
ฉันต้องการเรียกใช้คำสั่งย่อย bash (1) เรียกใช้คำสั่งไม่กี่คำ (2) จากนั้นยังคงอยู่ใน subshell นั้นเพื่อทำตามที่ฉันต้องการ ฉันสามารถทำสิ่งเหล่านี้เป็นรายบุคคล: เรียกใช้คำสั่งโดยใช้-cแฟล็ก: $> bash -c "ls; pwd; <other commands...>" อย่างไรก็ตามมันจะกลับสู่เชลล์ "super" ทันทีหลังจากเรียกใช้งานคำสั่ง ฉันยังสามารถเรียกใช้ subshell แบบโต้ตอบ: เริ่มbashกระบวนการใหม่: $> bash และมันจะไม่ออกจาก subshell จนกว่าฉันจะพูดอย่างชัดเจน ... แต่ฉันไม่สามารถเรียกใช้คำสั่งเริ่มต้นใด ๆ ทางออกที่ใกล้ที่สุดที่ฉันพบคือ: $> bash -c "ls; pwd; <other commands>; exec bash" ซึ่งใช้งานได้ แต่ไม่ใช่วิธีที่ฉันต้องการเพราะมันรันคำสั่งที่กำหนดในเชลล์ย่อยหนึ่งจากนั้นเปิดคำสั่งแยกต่างหากสำหรับการโต้ตอบ ฉันต้องการทำสิ่งนี้ในบรรทัดเดียว เมื่อฉันออกจาก subshell ฉันควรกลับไปที่เปลือก "super" ปกติโดยไม่เกิดปัญหา …
86 bash 

7
คุณมีมากกว่าหนึ่งไฟล์ ~ / .ssh / config ไหม
เรามีเซิร์ฟเวอร์ป้อมปราการที่เราใช้ในการเชื่อมต่อกับโฮสต์หลายแห่งและ. ssh / config ของเราเติบโตเป็นมากกว่าหนึ่งพันบรรทัด (เรามีโฮสต์นับร้อยที่เราเชื่อมต่อด้วย) นี่คือจุดเริ่มต้นที่จะได้รับการเทอะทะเล็กน้อยและฉันต้องการที่จะรู้ว่ามีวิธีที่จะทำลายไฟล์. ssh / config ขึ้นเป็นหลายไฟล์ ตามหลักแล้วเราจะระบุตำแหน่งที่ไฟล์อื่น ๆ จะถือว่าเป็นไฟล์. ssh / config ~/.ssh/config ~/.ssh/config_1 ~/.ssh/config_2 ~/.ssh/config_3 ... ฉันได้อ่านเอกสารเกี่ยวกับ ssh / config แล้วและฉันไม่เห็นว่าเป็นไปได้ แต่บางทีคนอื่นอาจมีปัญหาที่คล้ายกันและพบวิธีแก้ปัญหา
82 linux  ssh  unix  bash 

6
จะทดสอบได้อย่างไรว่าเซิร์ฟเวอร์ของฉันเสี่ยงต่อข้อผิดพลาด ShellShock หรือไม่
ฉันจะมั่นใจได้อย่างไรว่าการติดตั้ง Bash ของฉันไม่เสี่ยงต่อข้อผิดพลาดของShellShockอีกต่อไปหลังจากการอัพเดต
80 security  bash  cgi 

12
ฉันจะเรียกใช้คำสั่งที่ซับซ้อนตามอำเภอใจโดยใช้ sudo over ssh ได้อย่างไร
ฉันมีระบบที่สามารถเข้าสู่ระบบภายใต้ชื่อผู้ใช้ของฉัน (myuser) แต่ฉันต้องเรียกใช้คำสั่งในฐานะผู้ใช้อื่น (scriptuser) จนถึงตอนนี้ฉันได้พบกับสิ่งต่อไปนี้เพื่อเรียกใช้คำสั่งที่ฉันต้องการ: ssh -tq myuser@hostname "sudo -u scriptuser bash -c \"ls -al\"" หาก แต่เมื่อฉันพยายามเรียกใช้คำสั่งที่ซับซ้อนมากขึ้นเช่น[[ -d "/tmp/Some directory" ]] && rm -rf "/tmp/Some directory"ฉันประสบปัญหากับการอ้างอิงอย่างรวดเร็ว ฉันไม่แน่ใจว่าฉันจะส่งคำสั่งที่ซับซ้อนตัวอย่างนี้ไปได้bash -cอย่างไรเมื่อ\"จำกัด ขอบเขตของคำสั่งที่ฉันส่งไปแล้ว (และฉันไม่รู้วิธีการอ้างอิง / tmp / บางไดเร็กทอรีซึ่งรวมถึงช่องว่างด้วย มีวิธีการแก้ปัญหาทั่วไปที่ช่วยให้ฉันสามารถส่งคำสั่งใด ๆ ไม่ว่าจะมีความซับซ้อน / บ้าอ้างถึงหรือเป็นข้อ จำกัด บางอย่างที่ฉันได้มาถึง? มีวิธีแก้ปัญหาอื่น ๆ
80 ssh  bash  scripting  sudo 

4
มีความแตกต่างระหว่างเครื่องหมายแอมเพอร์แซนด์และเซมิโคลอนสองวิธีในการทุบตีอย่างไร?
หากฉันต้องการรันคำสั่งแยกกันสองคำในหนึ่งบรรทัดฉันสามารถทำสิ่งนี้ได้: cd /home; ls -al หรือสิ่งนี้: cd /home && ls -al และฉันก็ได้ผลเช่นเดียวกัน อย่างไรก็ตามสิ่งที่เกิดขึ้นในพื้นหลังด้วยวิธีการทั้งสองนี้? ความแตกต่างระหว่างการทำงานคืออะไร?
71 bash 

7
บันทึกคำสั่งทั้งหมดที่รันโดยผู้ดูแลระบบบนเซิร์ฟเวอร์ที่ใช้งานจริง
เป็นนโยบายของ บริษัท สำหรับผู้ดูแลระบบในการเข้าสู่เซิร์ฟเวอร์ผ่านชื่อผู้ใช้ส่วนบุคคลแล้วเรียกใช้sudo -iเพื่อกลายเป็นราก เมื่อเรียกใช้sudo -isudo จะสร้างตัวแปรสภาพแวดล้อมที่เรียกว่าSUDO_USERซึ่งมีชื่อผู้ใช้ดั้งเดิมของผู้ใช้ มีวิธีการบันทึกคำสั่งทั้งหมดใน syslog ด้วยสิ่งที่คล้ายกับไวยากรณ์ต่อไปนี้: ${TIME/DATE STAMP}: [${REAL_USER}|${SUDO_USER}]: ${CMD} รายการตัวอย่างจะเป็น: Sat Jan 19 22:28:46 CST 2013: [root|ksoviero]: yum install random-pkg เห็นได้ชัดว่ามันไม่จำเป็นต้องเป็นไวยากรณ์ข้างต้นอย่างแน่นอน แต่ก็ต้องมีผู้ใช้จริงขั้นต่ำ (เช่น root), ผู้ใช้ sudo (เช่น ksoviero) และคำสั่งทั้งหมดที่ถูกเรียกใช้ (เช่น yum ติดตั้งแบบสุ่ม -pkg) ฉันได้ลองsnoopyไปแล้วแต่ไม่ได้รวมSUDO_USERตัวแปร
70 centos  bash  logging  sudo 

8
วิธีรับ pid ของกระบวนการที่เพิ่งเริ่มต้น
ฉันต้องการเริ่มต้นกระบวนการ (เช่น myCommand) และรับ pid (เพื่ออนุญาตให้ฆ่าได้ในภายหลัง) ฉันลองใช้ ps และตัวกรองตามชื่อ แต่ฉันไม่สามารถแยกความแตกต่างของชื่อได้ myCommand ps ux | awk '/<myCommand>/ {print $2}' เพราะชื่อกระบวนการไม่ซ้ำกัน ฉันสามารถเรียกใช้กระบวนการโดย: myCommand & ฉันพบว่าฉันสามารถรับ PID นี้ได้โดย: echo $! มีวิธีแก้ไขที่ง่ายกว่านี้ไหม? ฉันยินดีที่จะรัน myCommand และรับ PID ของมันจากคำสั่งหนึ่งบรรทัด
70 linux  unix  bash  process  pid 

10
คุณสมบัติเฉพาะของทุบตีเมื่อเทียบกับ zsh
ฉันเป็นผู้ใช้ zsh มาระยะหนึ่งแล้ว (ก่อนหน้า tcsh และก่อนหน้านั้น csh) ฉันมีความสุขมากกับมัน แต่ก็สงสัยว่ามีคุณสมบัติที่น่าสนใจของทุบตีที่ไม่มีอยู่ใน zsh และในทางกลับกันมีคุณสมบัติ zsh ที่ไม่มีอยู่ใน bash ความรู้สึกปัจจุบันของฉันคือการทุบตีนั้นดีกว่า: หากคุณคุ้นเคยกับมันแล้วและไม่ต้องการเรียนรู้ไวยากรณ์ใหม่ มันจะมีอยู่ในเครื่อง * nix ส่วนใหญ่ตามค่าเริ่มต้นในขณะที่ zsh อาจเป็นการติดตั้งเพิ่มเติม ไม่พยายามเริ่มการต่อสู้ทางศาสนาที่นี่ซึ่งเป็นสาเหตุที่ฉันแค่มองหาคุณสมบัติที่มีอยู่ในกระสุนเพียงนัดเดียว
67 bash  shell  zsh 

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