2

だから私はbash内で正しく動作することを期待しようとしています。

スクリプトの内容は次のとおりです...

[root@mysql1 ~]# cat mysql_repl.sh
#!/bin/bash
read -p "Master server ip: " masterip
read -p "What is the regular user to log into the master server: " masteruser
read -p "What is the password for the regular user for the master server: " masterpass
read -p "What is the root password for the master server: " masterrootpass

read -p "Slave server ip: " slaveip
read -p "What is the regular user to log into the slave server: " slaveuser
read -p "What is the password for the regular user for the slave server: " slavepass
read -p "What is the root password for the slave server: " slaverootpass



expect -c "set slaveip $slaveip;\
set slaveuser $slaveuser;\
set slavepass $slavepass;\
set timeout -1;\
spawn /usr/bin/ssh $slaveip -l $slaveuser 'ls -lart';\
match_max 100000;
expect *password:;\
send -- $slavepass\r;\
interact;"

これがスクリプトの出力です...

[root@mysql1 ~]# ./mysql_repl.sh
Master server ip:
What is the regular user to log into the master server:
What is the password for the regular user for the master server:
What is the root password for the master server:
Slave server ip: xxx.xxx.xxx.xxx
What is the regular user to log into the slave server: rack
What is the password for the regular user for the slave server: test
What is the root password for the slave server: DVJrPey99grJ
spawn /usr/bin/ssh 198.61.221.179 -l rack 'ls -lart'
rack@198.61.221.179's password:
bash: ls -lart: command not found

コマンドが正しく実行されていません。/bin/ls も試しましたが、まだ見つかりません。

第二部...同じスクリプト...

私は bash に変数、具体的にはパスワードを持っています。この場合、パスワードは「as$5!@?」です。私がやりたいことは、各文字を調べて、それが特殊文字であるかどうかをテストし、それから脱出することです。だから例えば…

pass=as$5!@?

私がこれまでに持っているものは近いですが、特殊文字では機能しません。非特殊文字では機能します...

echo -n $pass | while read -n 1 c; do [[ "$c" = [!@#$%^&*().] ]] && echo -n "\\"; echo -n $c; done

各特殊文字の前に \ を追加する方法について考えている人はいますか?

これで問題が解決することを願っています。

4

1 に答える 1

2

最後の行ブロックで、エスケープする必要がある各特殊文字の前に \ を手動で追加してみてください。それは大した仕事ではないはずです。

また、等価チェックには == を使用します。つまり、次のようになります。

echo -n $pass | while read -n 1 c; do [[ "$c" == [!@#$%^&*().] ]] && echo -n "\\"; echo -n $c; done
于 2012-10-17T05:44:48.810 に答える