Hnusný chyták s heslem v sqlplus
Pokud pracujete s DB Oracle (a nejste čistokrevný "klikač"), zcela jistě znáte nástroj sqlplus tj. konzolového SQL klienta pro Oracle. Velmi spartánský nástroj (zapomeňte na historii příkazů, auto completion, jednoduchou editaci, ...) ale velmi efektivní a zhusta používaný pokud k serveru můžete jen přes SSH. Nicméně má svoje mouchy - na jednu hnusnou týkající se hesla jsem narazil v praxi ...
Pokud jste bezpečnostně uvědomělí, asi znáte pravidlo že heslo by mělo obsahovat nějakou netriviální kombinaci písmen, číslic a znaků - "franta123" asi není dobré heslo, zatímco "W4d23#!?s" už je myslím celkem dobré. Osobně pro vytváření aplikačních hesel používám generátor - stejně pak přijde někam do property souboru, tak proč si ho pamatovat.
A tady nastal zádrhel, protože během změny hesla na databázi mi generátor vyprodukoval řetězec obsahující zavináč, což mělo za následek zaprvé naprosté zmatení sqlplus, zadruhé mou zoufalou půlhodinovou snahu přesvědčit ho k připojení k databázi a zatřetí že před IT oddělením zákazníka vypadám jako blázen neschopný zadat heslo.
Nejjednodušší způsob jak sqlplus sdělit kam se má připojit je zadat na příkazové řádce řetězec ve formátu "login/heslo@SID" (kde SID je název Oracle instance). Už na první pohled je zřejmé že pokud heslo obsahuje zavináč (např. "abc@def"), bude se to bít se zavináčem za kterým je uvedeno SID, a Oracle vám prostě sdělí
$ sqlplus username/abc@def@orcl11g ERROR: ORA-12154: TNS:could not resolve the connect identifier specified
Zkusíte tedy heslo různě escapovat, zadávat ho v uvozovkách, ale pořád nic
$ sqlplus username/"abc@def"@orcl11g ERROR: ORA-12154: TNS:could not resolve the connect identifier specified $ sqlplus username/abc\@def@orcl11g ERROR: ORA-12154: TNS:could not resolve the connect identifier specified $ sqlplus username/"abc\@def"@orcl11g ERROR: ORA-12154: TNS:could not resolve the connect identifier specified $ sqlplus username/'abc@def'@orcl11g ERROR: ORA-12154: TNS:could not resolve the connect identifier specified
Potom heslo zkusíte zadat interaktivně, tj. neuvedete ho na příkazové řádce ale počkáte až se na něj sqlplus samo zeptá:
$ sqlplus username@orcl11g Enter password: ERROR: ORA-12154: TNS:could not resolve the connect identifier specified
Sqlplus si zřejmě interně sestaví kompletní connection string, a následně je z něj stejně zmatené jako když je zadaný přes příkazovou řádku.
Nebudu vás napínat - na žádný způsob jak heslo se zavináčem protlačit přes sqlplus jsem nepřišel. Nakonec jsem napsal IT podpoře zákazníka ať nám heslo resetne, načež mne vteřinu po odeslání e-mailu napadlo zkusit použít nějakého JDBC klienta (naštěstí jsme měli přístup i přes SQL Developera), a to naštěstí zafungovalo správně.
Jediná kladná zkušenost je že si tímto způsobem nemůžete účet zamknout, protože sqlplus neodkáže identifikovat instanci (tudíž se k ověřování hesla ani nedostane, o tom že by v instanci došlo k zamčení účtu ani nemluvě).





$ ORACLE_SID=orcl11g sqlplus /nolog
SQL> connect username/"abc@def"
Connected.
Pokud se pripojujete do DB vzdalene, namisto ORACLE_SID pouzijte TWO_TASK odpovidajici spojeni nadefinovanemu v tnsnames.ora.
Díky, zkusím. Zkoušel jsem všelicos ale toto jsem myslím nezkoušel.
Aha, tak to řešení přes "sqlplus /nolog" funguje. Ale i tak je divné že to nejde zadat z příkazové řádky.