Bash script และหนีอักขระพิเศษในรหัสผ่าน


10

ฉันได้อ่านคำถามมากมายที่ถามไปแล้วที่นี่ แต่อย่างใดไม่มีอะไรที่ทำงานให้ฉัน ฉันมีสคริปต์ทุบตีที่ฉันต้องส่งรหัสผ่านที่ฐานข้อมูลการถ่ายโอนข้อมูลในเครื่องระยะไกลดังนั้นมันชอบ:

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p#8111*@uu( my_database |  gzip -c >  my_database.sql.gz

สิ่งนี้คือรหัสผ่านนี้มีอักขระพิเศษทุกประเภท: #8111*@uu(

ถ้าฉันเรียกใช้คำสั่งดังกล่าวข้างต้นโดยตรงจะต้องใช้รหัสผ่านภายในเครื่องหมายคำพูดเดียวแล้วมันทำงาน: เช่น

/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'#8111*@uu(' my_database |  gzip -c >  my_database.sql.gz

หากไม่มีเครื่องหมายอัญประกาศเดี่ยวฉันจะได้รับข้อผิดพลาดด้วยสำหรับ '(' ที่ส่วนท้าย)

ฉันพยายามที่จะหลบหนีตัวละครด้วยรหัสผ่านเช่นนี้

!/bin/sh
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p'\#8111\*\@uu(' my_database |  gzip -c >  my_database.sql.gz

จากนั้นจะให้ข้อผิดพลาดถูกปฏิเสธการเข้าถึง

ฉันยังพยายามใช้ "แหล่ง" เช่น การบันทึกรหัสผ่านในไฟล์อื่นเป็น:

ไฟล์ pass.cre

MYPASSWORD='#8111*@uu('

จากนั้นรวมไฟล์นั้นในสคริปต์ทุบตี:

!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost mysqldump -u db_user -p$MYPASSWORD my_database |  gzip -c >  my_database.sql.gz

ดูเหมือนว่าจะอ่าน $ MYPASSWORD จากไฟล์แล้วเกิดข้อผิดพลาดอีกครั้งของอักขระที่ไม่ถูกต้อง

คำแนะนำใด ๆ ที่ฉันหายไป?

คำตอบ:


8

ใช้เครื่องหมายคำพูดสองครั้งหนีและไม่หนี: -p"\"$MYPASSWORD\""

#!/bin/sh
source pass.cre
/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p"\"$MYPASSWORD\"" my_database |  gzip -c >  my_database.sql.gz'

หรือรุ่นอื่น ๆ

/usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p\"'io#bc@14@9$#jf7AZlk99'\" my_database | gzip -c > my_database.sql.gz"

ตัวอย่าง

% source pass.cre
% ssh user@host mysqldump -u root -p$MYPASSWORD    
user@host's password: 
zsh:1: bad pattern: -p#8111*@uu(

% source pass.cre
% ssh user@host mysqldump -u root -p"$MYPASSWORD"   
user@host's password: 
zsh:1: bad pattern: -p#8111*@uu(

% source pass.cre
% ssh user@host mysqldump -u root -p"\"$MYPASSWORD\""
user@host's password: 
Warning: Using a password on the command line interface can be insecure.

ขอบคุณ @meuh และ AB แน่นอนมันสมเหตุสมผลแล้วและฉันได้ทำการทดสอบแล้วมันใช้งานได้ ขอบคุณมากสำหรับการชี้ให้ฉันไปในทิศทางที่ถูกต้อง
Saahib

ดูเหมือนว่าจะมีปัญหาเล็กน้อยฉันมีรหัสผ่านเช่นนี้: io#bc@14@9$#jf7AZlk99 สำหรับระยะไกลมันไม่ทำงานเช่น /usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p'io#bc@14@9$#jf7AZlk99' my_database | gzip -c > my_database.sql.gz" ฉันพยายามหลบหนีตามคำแนะนำที่นี่เช่น โปรดจำไว้ว่ามันถูกสั่งการสองครั้ง แต่ฉันคิดว่าเมื่อส่งคำสั่งผ่าน SSH ไปยังเซิร์ฟเวอร์ระยะไกลสิ่งต่าง ๆ ดูเหมือนจะเปลี่ยนแปลงเล็กน้อย
Saahib

ใช้/usr/bin/ssh -p 91899 user@remoteHost "mysqldump -u db_user -p\"'io#bc@14@9$#jf7AZlk99'\" my_database | gzip -c > my_database.sql.gz"
AB

@Rick_IRS เห็นการแก้ไขคำตอบของฉันเนื่องจากคุณมีปัญหา$#และต้องการคำพูดเดียวตลอด
meuh

3

ปัญหาคือสตริงของคุณจะถูกตีความสองครั้งโดยเชลล์ท้องถิ่นและอีกครั้งโดยเชลล์ระยะไกลที่sshใช้สำหรับคุณ ดังนั้นคุณต้องพูดสองครั้งโดยใช้อย่างใดอย่างหนึ่งเหล่านี้:

-p\''#8111*@uu('\'
-p"'#8111*@uu('"

แก้ไข: หากคุณกำลังจะไปอ้างดับเบิลคำสั่งทั้งหมดคุณจะมีปัญหาเกี่ยวกับรหัสผ่านที่มี"" $คุณต้องอ้างคำสั่งเดียวเพื่อหลีกเลี่ยงปัญหานี้ แต่คุณยังต้องอ้างถึง-pค่าเดียวเนื่องจากมันถูกตีความสองครั้ง ดังนั้นคุณต้องใช้เครื่องหมายคำพูดเดี่ยวในเครื่องหมายคำพูดเดี่ยว

สิ่งนี้ทำได้โดยใช้เครื่องหมายคำพูดเดี่ยว ( \') ในตัวอย่างนี้:

'I don'\''t like java'

I don't like javaจะทำให้คุณสตริง ดังนั้นตัวอย่างที่ยกมาสองครั้งของคุณจะกลายเป็นการอ้างอิงแบบเดี่ยว:

/usr/bin/ssh -p 91899 user@remoteHost 'mysqldump -u db_user -p'\''io#bc@14@9$#jf7AZlk99'\''my_database | gzip -c > my_database.sql.gz'

คุณไม่เพียงแค่รักมันเหรอ?

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