Сценарій Bash та уникнення спеціальних символів у паролі


10

Я читав тут уже багато запитань, однак якось нічого не працює для мене. У мене є скрипт bash, куди я мушу надсилати пароль, який скидає базу даних на віддаленій машині, так це:

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

Потім включіть цей файл у bash script:

!/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, це, безумовно, має сенс, і я перевірив це, його робота. Дякую хлопцям за те, що вказали на мене в правильному напрямку.
Саахіб

Здається, є невелика проблема, у мене є такий пароль: 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 на віддалений сервер, схоже, щось мало змінилося.
Саахіб

Використання/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'

Ви просто не любите це?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.