Bash skrip dan lepaskan karakter khusus dengan kata sandi

10

Saya telah membaca banyak pertanyaan yang sudah diajukan di sini, bagaimanapun, entah bagaimana tidak ada yang berhasil untuk saya. Saya memiliki skrip bash di mana saya harus mengirim kata sandi yang membuang basis data pada mesin jarak jauh, jadi seperti:

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

Sekarang masalahnya adalah kata sandi ini memiliki semua jenis karakter khusus: #8111*@uu(

Jika saya menjalankan perintah di atas secara langsung akan menggunakan kata sandi di dalam tanda kutip tunggal maka itu berfungsi: yaitu.

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

Tanpa tanda kutip tunggal saya mendapatkan kesalahan dengan untuk '(' di akhir.

Saya juga mencoba melarikan diri karakter dengan kata sandi seperti ini:

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

Kemudian itu memberikan akses ditolak kesalahan.

Saya juga mencoba menggunakan "sumber" yaitu. menyimpan kata sandi di file lain sebagai:

File pass.cre

MYPASSWORD='#8111*@uu('

Kemudian termasuk file itu dalam skrip 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

Tampaknya membaca $ MYPASSWORD dari file sekali lagi kesalahan karakter yang tidak valid.

Ada saran apa yang saya lewatkan?

Saahib
sumber

Jawaban:

8

Gunakan tanda kutip ganda dua kali, lolos dan tidak lolos: -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'

Atau versi lain

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

Contohnya

% 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.
AB
sumber
Terima kasih @meuh dan AB, itu tentu saja masuk akal dan saya telah mengujinya, ini berfungsi. Terima kasih teman-teman karena mengarahkan saya ke arah yang benar.
Saahib
Tampaknya ada sedikit masalah, saya punya kata sandi seperti ini: io#bc@14@9$#jf7AZlk99 Untuk jarak jauh, itu tidak berfungsi yaitu. /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" Saya mencoba untuk melarikan diri seperti yang disarankan di sini yaitu. mengingat bahwa itu telah dieksekusi dua kali tetapi saya pikir ketika mengirim perintah melalui SSH ke server jauh, hal-hal tampaknya sedikit berubah.
Saahib
Gunakan/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 melihat edit saya pada jawaban saya karena Anda memiliki masalah dengan $#dan membutuhkan satu tanda kutip.
meuh
3

Masalahnya adalah string Anda ditafsirkan dua kali, sekali oleh shell lokal, dan sekali lagi oleh shell jauh yang sshberjalan untuk Anda. Jadi, Anda perlu mengutip dua kali, menggunakan salah satu dari ini:

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

Sunting: Jika Anda akan mengutip ""seluruh perintah, Anda akan mengalami masalah dengan kata sandi yang berisi $. Anda perlu mengutip perintah untuk menghindari ini. Tapi Anda masih perlu mengutip -pnilai karena ditafsirkan dua kali. Jadi, Anda perlu tanda kutip tunggal di dalam tanda kutip tunggal.

Ini dilakukan dengan menggunakan satu kutipan kutip ( \') seperti dalam contoh ini:

'I don'\''t like java'

akan memberi Anda string I don't like java. Jadi, contoh kutip ganda Anda menjadi kutipan tunggal:

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

Tidakkah kamu menyukainya saja?

meuh
sumber