เชลล์สคริปต์เพื่ออัปโหลดไฟล์ไปยังไดเรกทอรีย่อยเดียวกันบนเซิร์ฟเวอร์ระยะไกล
งานที่พบบ่อยมากสำหรับนักพัฒนาเว็บกำลังอัปโหลดไฟล์เดียวจากไดเรกทอรีย่อยในกล่องพัฒนาของคุณไปยังไดเรกทอรีย่อยเดียวกันบนเซิร์ฟเวอร์ระยะไกล แต่น่าเสียดายที่นี่เป็นกระบวนการที่ทำด้วยตนเองที่น่ารำคาญซึ่งเกี่ยวข้องกับการสลับไดเรกทอรีบนเซิร์ฟเวอร์ทั้งสองและเสียเวลาเป็นจำนวนมาก.
ดังนั้นฉันจึงต้องเขียนสคริปต์เชลล์เพื่อทำสิ่งนี้ให้ฉันโดยอัตโนมัติโดยใช้ scp สำหรับการคัดลอกไฟล์อย่างปลอดภัย (หมายเหตุด้านที่สำคัญ: ftp ไม่ปลอดภัยอย่างน่ากลัวใช้ WinSCP แทน)
ปัญหาหลักในการแก้ไขคือ WordPress ของฉันติดตั้งบนเครื่องพัฒนาของฉันมีไดเรกทอรีพื้นฐานที่แตกต่างจากการติดตั้งบนเซิร์ฟเวอร์ของฉัน บนเครื่องพัฒนาของฉันมัน / var / www และบนเซิร์ฟเวอร์ของฉันก็เป็นอะไรเพิ่มเติมเช่น / var / www / howtogeek / docs / ฉันตัดสินใจที่จะย้ายสิ่งเหล่านั้นไปยังตัวแปรที่จุดเริ่มต้นของสคริปต์เช่นนี้
[email protected]
RDIR = / var / www / howtogeek / เอกสาร
LDIR = "\ / var \ / www"
โปรดสังเกตว่าโลคัลไดเร็กทอรี (LDIR) ในสคริปต์มี \ ก่อนหน้า / ในพา ธ นี่เป็นเพราะเราจะส่งผ่านสิ่งนี้ไปยังคำสั่ง sed ในสคริปต์ดังนั้นเราจึงต้องหลีกเลี่ยงค่าเหล่านั้น ฉันแน่ใจว่ามีวิธีอื่น ๆ รอบนี้ แต่ฉันไม่รู้.
ต่อไปฉันจะตั้งค่าการล็อกอินอัตโนมัติ หากต้องการทำสิ่งนี้คุณต้องเรียกใช้ยูทิลิตี ssh keygen ก่อนดังนี้:
ssh-keygen -t rsa
จากนั้นคุณต้องคัดลอกไฟล์ ~ / .ssh / id_rsa.pub ไปยังไฟล์ ~ / .ssh / authorized_keys บนเซิร์ฟเวอร์ระยะไกล หากไดเร็กทอรี ~ / .ssh ถูกสร้างขึ้นแล้วบนเซิร์ฟเวอร์ระยะไกล (อาจต้องการตรวจสอบ) จากนั้นคุณสามารถเรียกใช้คำสั่งนี้เพื่อคัดลอกคีย์ทับ:
cat ~ / .ssh / id_rsa.pub | ssh user @ hostname 'cat >> .ssh / authorized_keys'
ตอนนี้เรามีการล็อกอินอัตโนมัติ ssh ซึ่งจะเปิดใช้งานการใช้ยูทิลิตี้ scp โดยไม่ต้องใช้รหัสผ่าน ตอนนี้ลองมาดูคำสั่ง scp ที่เราจะใช้ในสคริปต์:
SCP $ 1 $ SSHSERVER: $ RDIR'pwd | sed“ s / $ LDIR //” '/' echo $ 1 | sed 's /.*\/// "
$ 1 คือพารามิเตอร์ที่คุณจะส่งต่อไปยังสคริปต์สำหรับชื่อไฟล์ที่คุณพยายามอัปโหลด $ SSHSERVER และ $ RDIR เป็นตัวแปรที่เราจะตั้งไว้ที่จุดเริ่มต้นของสคริปต์เพื่อตั้งชื่อผู้ใช้ @ hostname และเส้นทางระยะไกลก่อนหน้า.
บล็อกแรกที่เริ่มต้นด้วย pwd | sed ใช้พา ธ ไดเร็กทอรีปัจจุบันและตัดส่วนที่อยู่ก่อนหน้าของพา ธ ที่ไม่ตรงกับรีโมตเซิร์ฟเวอร์ แต่ออกจากพา ธ ที่เหลือ ตัวอย่างเช่นหากคุณอยู่ใน / var / www / wp-content / เมื่อคุณรันคำสั่งบล็อก sed จะดึงออก / var / www ตามตัวแปร LDIR ของเรา แต่ปล่อยให้ / wp-content / ส่วนหนึ่ง.
บล็อกที่สองจะตรวจสอบให้แน่ใจว่าได้ตัดทอนเส้นทางก่อนหน้าทั้งหมดออกจากชื่อไฟล์ที่ส่งไปยังสคริปต์ดังนั้นคุณจะได้รับชื่อไฟล์.
ตัวอย่างเช่นหากคุณตั้งชื่อสคริปต์ up.sh และรันจากโลคัล / var / www / wp-content / plugins / directory บนไฟล์:
up.sh myplugin.php
สิ่งนี้จะถูกขยายโดยเชลล์ดังต่อไปนี้:
scp myplugin.php [email protected]: /var/www/howtogeek/docs/wp-content/plugins/myplugin.php
แทนที่จะพยายามสร้างไฟล์สคริปต์ของคุณเองตามบทความเราได้จัดเตรียมไฟล์ให้คุณดาวน์โหลด ด้วยวิธีนี้จะไม่มีปัญหาใด ๆ กับตัวละครพิเศษที่ไม่ทำงาน ... และใช่ฉันใช้สคริปต์เพื่ออัปโหลดตัวเอง =)
ดาวน์โหลด geek-uploader.sh
เพียงวางไว้ที่ไหนสักแห่งในเส้นทางของคุณและตั้งชื่อตามที่คุณต้องการ ฉันเปลี่ยนชื่อเป็น "ขึ้น" เพื่อให้ฉันสามารถพิมพ์ "up filename.txt" เพื่ออัปโหลด อย่าลืมเปิดขึ้นและเปลี่ยนตัวแปรที่จุดเริ่มต้นของสคริปต์เพื่อให้ตรงกับสภาพแวดล้อมของคุณ.
สคริปต์นี้ควรทำงานกับทุกสิ่งที่มี * เปลือกหอยและยูทิลิตี้ scp ฉันใช้ Ubuntu แต่ควรใช้กับ Solaris, OS X หรือแม้แต่ Windows ที่ติดตั้ง Cygwin.