Bash script và thoát các ký tự đặc biệt trong mật khẩu


10

Tôi đã đọc rất nhiều câu hỏi đã được hỏi ở đây, tuy nhiên, bằng cách nào đó, không có gì hiệu quả với tôi. Tôi có một tập lệnh bash nơi tôi phải gửi mật khẩu kết xuất cơ sở dữ liệu trên máy từ xa, vì vậy nó giống như:

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

Bây giờ điều là mật khẩu này có tất cả các loại ký tự đặc biệt: #8111*@uu(

Nếu tôi chạy lệnh trên trực tiếp sẽ sử dụng mật khẩu bên trong dấu ngoặc đơn thì nó hoạt động: tức là.

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

Nếu không có dấu ngoặc đơn, tôi sẽ gặp lỗi với '(' ở cuối.

Tôi cũng đã cố thoát các ký tự trong mật khẩu như thế này:

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

Sau đó, nó cung cấp cho truy cập từ chối lỗi.

Tôi cũng đã thử sử dụng "nguồn" tức là. lưu mật khẩu trong một tệp khác như:

Tệp pass.cre

MYPASSWORD='#8111*@uu('

Sau đó bao gồm tệp đó trong tập lệnh bash:

!/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

Có vẻ như đang đọc $ MYPASSWORD từ tệp sau đó lại gặp lỗi ký tự không hợp lệ.

Bất cứ lời khuyên nào tôi đang thiếu?

Câu trả lời:


8

Sử dụng dấu ngoặc kép hai lần, thoát và không thoát: -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'

Hoặc một phiên bản khác

/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"

Ví dụ

% 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.

Cảm ơn @meuh và AB, nó chắc chắn có ý nghĩa và tôi đã thử nó, nó hoạt động. Cảm ơn các bạn đã chỉ cho tôi đi đúng hướng.
Saahib

Dường như có một vấn đề nhỏ, tôi có mật khẩu như thế này: io#bc@14@9$#jf7AZlk99 Đối với điều khiển từ xa, nó không hoạt động. /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" Tôi đã cố gắng trốn thoát như đề nghị ở đây tức là. Hãy nhớ rằng nó đã được thực thi hai lần nhưng tôi nghĩ khi gửi lệnh qua SSH đến máy chủ từ xa, mọi thứ dường như ít thay đổi.
Saahib

Sử dụng/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 xem bản chỉnh sửa của tôi cho câu trả lời của tôi khi bạn gặp vấn đề $#và cần trích dẫn duy nhất trong suốt.
meuh 04/07/2015

3

Vấn đề là chuỗi của bạn đang được giải thích hai lần, một lần bởi shell cục bộ và một lần nữa bởi shell từ xa sshđang chạy cho bạn. Vì vậy, bạn cần trích dẫn hai lần, sử dụng một trong hai cách sau:

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

Chỉnh sửa: Nếu bạn định trích dẫn ""toàn bộ lệnh, bạn sẽ gặp vấn đề với mật khẩu chứa $. Bạn cần trích dẫn lệnh để tránh điều này. Nhưng bạn vẫn cần trích dẫn một -pgiá trị vì nó được diễn giải hai lần. Vì vậy, bạn cần dấu ngoặc đơn trong dấu ngoặc đơn.

Điều này được thực hiện bằng cách sử dụng một trích dẫn trích dẫn ( \') như trong ví dụ này:

'I don'\''t like java'

sẽ cung cấp cho bạn chuỗi I don't like java. Vì vậy, ví dụ được trích dẫn kép của bạn trở thành trích dẫn đơn:

/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'

Không phải bạn chỉ thích nó?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.