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

เชลล์เป็นอินเตอร์เฟสบรรทัดคำสั่งของ Unix คุณสามารถพิมพ์คำสั่งในเชลล์แบบโต้ตอบหรือเขียนสคริปต์เพื่อทำงานอัตโนมัติ ใช้แท็กนี้สำหรับคำถามที่ใช้กับ / bin / sh และเชลล์ที่เข้ากันได้มากที่สุด (ash, bash, ksh, zsh, …) สำหรับเชลล์สคริปต์ที่มีข้อผิดพลาดโปรดตรวจสอบใน http://shellcheck.net ก่อนโพสต์ที่นี่

7
มีวิธีการส่งผ่านข้อมูลที่สำคัญใน bash โดยใช้พรอมต์สำหรับคำสั่งใด ๆ ?
สมมติว่าฉันกำลังใช้sha1passเพื่อสร้างแฮชของรหัสผ่านที่ละเอียดอ่อนบางตัวในบรรทัดคำสั่ง ฉันสามารถใช้sha1pass mysecretเพื่อสร้างแฮชของmysecretแต่นี่มีข้อเสียที่mysecretตอนนี้อยู่ในประวัติศาสตร์ทุบตี มีวิธีการที่จะบรรลุเป้าหมายสุดท้ายของคำสั่งนี้ในขณะที่หลีกเลี่ยงการเปิดเผยmysecretในข้อความธรรมดาpasswdหรือไม่โดยใช้คำสั่ง-style? ฉันสนใจวิธีการทั่วไปในการทำเช่นนี้เพื่อส่งผ่านข้อมูลที่ละเอียดอ่อนไปยังคำสั่งใด ๆ วิธีการจะเปลี่ยนเมื่อข้อมูลที่ละเอียดอ่อนถูกส่งผ่านเป็นอาร์กิวเมนต์ (เช่นในsha1pass) หรือใน STDIN ไปยังคำสั่งบางอย่าง มีวิธีการทำสิ่งนี้หรือไม่? แก้ไข : คำถามนี้ดึงดูดความสนใจจำนวนมากและมีคำตอบที่ดีหลายข้อเสนอด้านล่าง สรุปคือ: ตามคำตอบของ @ Kusalanandaเราจะไม่ต้องให้รหัสผ่านหรือความลับเป็นอาร์กิวเมนต์บรรทัดคำสั่งสำหรับยูทิลิตี้ สิ่งนี้มีความเสี่ยงในหลายวิธีตามที่อธิบายไว้โดยเขาและควรใช้ยูทิลิตี้ที่ออกแบบมาดีกว่าที่สามารถรับข้อมูลลับบน STDIN ได้ คำตอบของ @ vfbsilvaอธิบายถึงวิธีการป้องกันไม่ให้สิ่งต่าง ๆ ถูกเก็บไว้ในประวัติทุบตี @ คำตอบของโจนาธานอธิบายวิธีการที่ดีอย่างสมบูรณ์แบบสำหรับการทำสิ่งนี้ให้สำเร็จตราบใดที่โปรแกรมสามารถใช้ข้อมูลลับของมันใน STDIN ดังนั้นฉันตัดสินใจยอมรับคำตอบนี้ sha1passใน OP ของฉันเป็นเพียงตัวอย่าง แต่การสนทนาได้กำหนดว่ามีเครื่องมือที่ดีกว่าที่ใช้ข้อมูลบน STDIN เป็น@R ..บันทึกในคำตอบของเขาการใช้คำสั่งขยายบนตัวแปรไม่ปลอดภัย ดังนั้นโดยสรุปฉันยอมรับคำตอบของ @ Jonathanเนื่องจากเป็นทางออกที่ดีที่สุดเนื่องจากคุณมีโปรแกรมที่ออกแบบมาอย่างดีและมีความประพฤติดี แม้ว่าการส่งรหัสผ่านหรือความลับในฐานะที่เป็นอาร์กิวเมนต์บรรทัดคำสั่งจะไม่ปลอดภัยโดยพื้นฐาน

5
จะสร้างฟัง TCP ได้อย่างไร?
เกริ่นนำ:ฉันได้สร้างฟังก์ชั่นทุบตีที่สามารถตรวจสอบได้ว่าพอร์ตนั้นสามารถใช้งานได้หรือไม่และเพิ่มขึ้นทีละ 1 ถ้าเป็นเท็จจนกว่าจะถึงหมายเลขพอร์ตสูงสุดที่แน่นอน เช่นถ้าพอร์ต 500 ใช้งานไม่ได้จะมีการตรวจสอบความพร้อมของ 501 จนถึง 550 จุดมุ่งหมาย:เพื่อทดสอบฟังก์ชั่นทุบตีนี้ฉันจำเป็นต้องสร้างช่วงของพอร์ตที่อยู่ในสถานะ LISTEN ความพยายาม:ใน Windows สามารถสร้างพอร์ต LISTEN โดยใช้คำสั่ง PowerShell เหล่านี้ : PS C:\Users\u> netstat -nat | grep 1234 PS C:\Users\u> $listener = [System.Net.Sockets.TcpListener]1234 PS C:\Users\u> $listener.Start(); PS C:\Users\u> netstat -nat | grep 1234 TCP 0.0.0.0:1234 0.0.0.0:0 LISTENING InHost PS C:\Users\u> $listener.Stop(); PS …
40 shell  networking  tcp 



4
เหตุใดคำสั่ง `cd` จึงไม่ทำงานผ่าน SSH
ฉันพยายามสำรองไฟล์บางไฟล์ผ่าน SSH แต่แทนที่จะเอาไฟล์tarที่ฉันต้องการฉันมีโฟลเดอร์บ้านของฉัน ฉันทำการทดสอบเพิ่มเติมและมันก็ลดลงไปถึงสิ่งนี้: ssh root@server /bin/sh -c "cd /boot && ls -l" ซึ่งไปยังไฟล์รายการแปลกใจของฉันในไม่ได้/root /bootแต่ถ้าฉันรัน/bin/shคำสั่งทั้งหมดจากเทอร์มินัลมันจะทำการcds และพิมพ์/bootไฟล์ เกิดอะไรขึ้นที่นี่
39 shell  ssh  cd-command 

4
/ dev / tcp ฟังแทนฟัง nc
ด้วยผู้ฟัง netcat เช่น: nc -l <port> < ~/.bashrc ฉันสามารถคว้า. bashrc ของฉันบนเครื่องใหม่ (ไม่มีncหรือ LDAP) ด้วย: cat < /dev/tcp/<ip>/<port> > ~/.bashrc คำถามของฉันคือ: มีวิธีที่จะเลียนแบบความสามารถของnc -l <port>ในบรรทัดแรกของฉันด้วย / dev / tcp แทนที่จะเป็นnc? เครื่องที่ฉันทำงานอยู่นั้นมีสภาพแวดล้อมของห้องแล็บ / แซนด์บ็อกซ์ที่แข็งมาก RHEL (ไม่มี ssh, no nc, ไม่มี LDAP, yum, ฉันไม่สามารถติดตั้งซอฟต์แวร์ใหม่และพวกเขาไม่ได้เชื่อมต่อกับอินเทอร์เน็ต)

3
คำสั่งมาตรฐานใดที่มีอยู่ในการแจกจ่ายบน Linux ทุกครั้ง
ฉันต้องการที่จะรู้ว่าคำสั่งมาตรฐานที่มีอยู่ในทุกระบบ Linux ตัวอย่างเช่นถ้าคุณได้รับ debian / ubuntu / redhat / suse / arch / slackware เป็นต้นคุณจะพบคำสั่งที่นั่นเสมอ: cd, mkdir, ls, echo, grep, sed, awk, ping เป็นต้น ฉันรู้ว่าคำสั่งที่กล่าวถึงบางคำเป็น shell-builtin แต่คำสั่งอื่น ๆ ไม่ได้ แต่พวกเขายังคงอยู่ที่นั่นเสมอ (ตามความรู้และประสบการณ์ของฉัน) ในทางกลับกันคำสั่งเช่น gawk, แยก, traceroute และคำสั่งที่โด่งดังอื่น ๆ จะไม่ถูกติดตั้งโดยค่าเริ่มต้นในการแจกแจงลินุกซ์ที่แตกต่างกัน ฉันค้นหาเว็บต่าง ๆ แต่ฉันไม่พบคำตอบตรงๆ จุดประสงค์คือฉันต้องการสร้างเชลล์สคริปต์และควรทำการตรวจสอบสติบางอย่างหากคำสั่งที่ใช้ในสคริปต์นั้นมีอยู่ในระบบ หากไม่เป็นเช่นนั้นควรแจ้งให้ผู้ใช้ติดตั้งไบนารีที่จำเป็น

7
ทำไมตัวแปร PATH แตกต่างกันเมื่อทำงานผ่าน sudo และ su
ใน fedora VM ของฉันเมื่อทำงานกับบัญชีผู้ใช้ของฉันฉันมี/usr/local/binในเส้นทางของฉัน: [justin@justin-fedora12 ~]$ env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin และเช่นเดียวกันเมื่อทำงานsu: [justin@justin-fedora12 ~]$ su - Password: [root@justin-fedora12 justin]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin อย่างไรก็ตามเมื่อเรียกใช้ผ่านsudoไดเรกทอรีนี้ไม่ได้อยู่ในเส้นทาง: [root@justin-fedora12 justin]# exit [justin@justin-fedora12 ~]$ sudo bash [root@justin-fedora12 ~]# env | grep PATH PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin ทำไมเส้นทางที่จะแตกต่างกันเมื่อใช้ผ่านsudo?

2
เหตุใดการใช้ && 75 ครั้งเร็วกว่าถ้า ... fi และวิธีทำให้โค้ดชัดเจนขึ้น
ฉันมีรหัสการทำงานต่อไปนี้: largest_prime=1 for number_under_test in {1..100} do is_prime=true factors='' for ((divider = 2; divider < number_under_test-1; divider++)); do remainder=$(($number_under_test % $divider)) [ $remainder == 0 ] && [ is_prime ] && is_prime=false && factors+=$divider' ' done [ $is_prime == true ] && echo "${number_under_test} is prime!" || echo "${number_under_test} is …

4
มีเครื่องมือทุบตีง่ายๆที่สามารถแสดง HTML พื้นฐานได้อย่างรวดเร็ว?
ในบางครั้งฉันต้องทำงานง่ายๆโดยที่ฉันส่ง HTML พื้นฐานไปยังคอนโซล ฉันต้องการให้แสดงผลน้อยที่สุดเพื่อให้อ่านง่ายขึ้น มียูทิลิตี้ที่สามารถจัดการการแสดง HTML ขั้นพื้นฐานในเชลล์ได้หรือไม่ (คิดว่าเป็นการแสดงผลแบบLynx - แต่ไม่ใช่เบราว์เซอร์จริง)? ตัวอย่างเช่นบางครั้งฉันจะใส่watchในmod_statusหน้าของ Apache : watch -n 1 curl http://some-server/server-status ผลลัพธ์ของหน้าคือ HTML ที่มีมาร์กอัปน้อยที่สุดซึ่งแสดงในเชลล์เช่น: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"> <html><head> <title>Apache Status</title> </head><body> <h1>Apache Server Status for localhost</h1> <dl><dt>Server Version: Apache/2.2.22 (Ubuntu) PHP/5.3.10-1ubuntu3.15 with Suhosin-Patch</dt> <dt>Server Built: Jul 22 2014 14:35:25 …

4
ชื่อที่ถูกต้องสำหรับคำสั่ง“>” คืออะไร
ฉันพยายามค้นหาวิธีส่งข้อความไปยังไฟล์โดยไม่เขียนทับสิ่งที่มีอยู่แล้วโดยใช้>คำสั่งและฉันก็รู้ว่าไม่รู้ว่ามันเรียกอะไร ค้นหาลูกศรขวาหรือเครื่องหมายบั้งขวาหรือมากกว่าคำสั่งไม่แสดงอะไร ฉันเคยเรียกว่าเพียงแค่มันผ่านไป

10
ชื่อตัวแปรของเชลล์มียัติภังค์หรือขีดกลาง (-) หรือไม่?
ฉันไม่สามารถใช้-ตัวแปรในเชลล์ได้ มีวิธีที่จะใช้งานได้หรือไม่เพราะฉันมีหนึ่งสคริปต์ซึ่งขึ้นอยู่กับตัวแปรที่มีชื่อดังกล่าว: $export a-b=c -bash: export: `a-b=c': not a valid identifier $export a_b=c ก่อนโยนข้อผิดพลาดที่กำหนดและครั้งที่สองทำงานได้ดี

15
เชลล์เชิงอ็อบเจ็กต์สำหรับ * ระวัง
คำนำ: ฉันรักการทุบตีและไม่มีความตั้งใจที่จะเริ่มโต้เถียงหรือสงครามศักดิ์สิทธิ์และหวังว่านี่จะไม่ใช่คำถามที่ไร้เดียงสาอย่างยิ่ง คำถามนี้ค่อนข้างเกี่ยวข้องกับโพสต์นี้ใน superuser แต่ฉันไม่คิดว่า OP รู้จริง ๆ ว่าเขาขออะไร ฉันใช้ bash บน FreeBSD, linux, OS X และ cygwin บน Windows ฉันเคยมีประสบการณ์มากมายกับ PowerShell บน Windows เมื่อเร็ว ๆ นี้ มีเชลล์สำหรับ * nix, มีอยู่แล้วหรือในงานที่เข้ากันได้กับ bash แต่เพิ่มเลเยอร์ของสคริปต์เชิงวัตถุลงในมิกซ์หรือไม่ สิ่งเดียวที่ฉันรู้ว่าใกล้เข้ามาคือคอนโซลหลาม แต่เท่าที่ฉันสามารถบอกได้ว่ามันไม่ได้ให้การเข้าถึงสภาพแวดล้อมเชลล์มาตรฐาน ตัวอย่างเช่นผมไม่สามารถเพียงcd ~และlsจากนั้นchmod +x fileภายในคอนโซลหลาม ฉันจะต้องใช้หลามเพื่อทำงานเหล่านั้นมากกว่าไบนารียูนิกซ์มาตรฐานหรือโทรไบนารีโดยใช้รหัสหลาม มีเชลล์อยู่จริงหรือไม่?

3
ไพพ์คำสั่งหลังจาก xargs ไพพ์
HP-UX ***** B.11.23 U ia64 **** ใบอนุญาตผู้ใช้ไม่ จำกัด find . -type d -name *log* | xargs ls -la ให้ฉันชื่อไดเรกทอรี (คนที่มีlogอยู่ในชื่อไดเรกทอรี) ตามด้วยไฟล์ทั้งหมดในไดเรกทอรีนั้น ไดเรกทอรี /var/opt/SID/application_a/log/, /var/opt/SID/application_b/log/, /var/opt/SID/application_c/log/และอื่น ๆ ประกอบด้วยไฟล์บันทึก ฉันต้องการเพียงสอง logfiles ล่าสุดที่จะแสดงตามคำสั่งซึ่งผมมักจะพบการใช้lsls -latr | tail -2 ผลลัพธ์จะต้องมีลักษณะเช่นนี้ .. /var/opt/SID/application_a/log/ -rw-rw-rw- 1 user1 user1 59698 Jun 11 2013 log1 -rw-rw-rw- 1 user1 user1 …
38 shell  find  pipe  xargs 

3
การส่งออกตัวแปรที่มีจุด (.) อยู่ในนั้น
วิธีการส่งออกตัวแปรที่มีจุดอยู่ในนั้น ฉันได้รับ 'ชื่อตัวแปรที่ไม่ถูกต้อง' เมื่อพยายาม: export my.home=/tmp/someDir -ksh: my.home=/tmp/someDir: invalid variable name แม้แต่การหลบหนี metacharacter dot (.) ก็ไม่ได้ช่วยเช่นกัน $ export my\.home=/tmp/someDir export: my.home=/tmp/someDir: is not an identifier

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