രണ്ട് ക്ലയന്റുകളും ഒരേ ലാപ്ടോപ്പിലാണ്, ഒരേ ടണലിലൂടെ കടന്നുപോകുന്നു, എന്നാൽ അവയിലൊന്ന് മാത്രമാണ് കണക്റ്റ് ചെയ്യുന്നത്. ആ താരതമ്യം VPN തിരഞ്ഞെടുക്കുന്നു എന്നതിന് തെളിവായി തോന്നാം, എന്നാൽ വളരെ സാധാരണമായ വിശദീകരണം രണ്ട് ക്ലയന്റുകളും വ്യത്യസ്ത ലക്ഷ്യങ്ങളിലേക്ക് ഡയൽ ചെയ്യുന്നു എന്നതാണ്. ഒരു GUI സ്വന്തം ഹോസ്റ്റ്, പോർട്ട്, റോൾ, TLS ക്രമീകരണങ്ങൾ സൂക്ഷിക്കുകയും ആവശ്യമുള്ളപ്പോൾ നിശബ്ദമായി ഒരു SSH ഫോർവേഡ് നിർമ്മിക്കുകയും ചെയ്യുന്നു, അതേസമയം psql നിങ്ങളുടെ ഷെൽ ഇതിനകം സജ്ജീകരിച്ചേക്കാവുന്ന libpq ഡിഫോൾട്ടുകളിൽ നിന്ന് കണക്ഷൻ കൂട്ടിച്ചേർക്കുന്നു. പ്രവർത്തിക്കുന്ന കണക്ഷൻ പുനർനിർമ്മിക്കുന്നത് GUI ക്രമീകരണങ്ങൾ വായിക്കുന്ന കാര്യമാണ്, ടണൽ വീണ്ടും ഇൻസ്റ്റാൾ ചെയ്യുന്നതല്ല.

മിത്ത്: ഒരു പ്രവർത്തിക്കുന്ന ക്ലയന്റ് പാത തെളിയിക്കുന്നു

GUI കണക്റ്റ് ചെയ്താൽ ടണൽ ട്രാഫിക് കൊണ്ടുപോകുന്നു, GUI തെളിയിക്കുന്നത് അത്രമാത്രം. psql ഏത് വിലാസം പരിഹരിക്കുന്നു, ഏത് റോളിൽ പ്രാമാണീകരിക്കുന്നു, അല്ലെങ്കിൽ അത് തുറക്കുന്ന സോക്കറ്റ് എപ്പോഴെങ്കിലും യന്ത്രത്തിൽ നിന്ന് പുറത്തുപോകുന്നുണ്ടോ എന്നതിനെക്കുറിച്ച് ഒന്നും പറയുന്നില്ല. പാത പങ്കിട്ടതാണ്; പാരാമീറ്ററുകൾ അല്ല.

ലോക്കൽ ഫോർവേഡ് വിടവ് വിശാലമാക്കുന്നു. GUI SSH വഴി ഫോർവേഡ് ചെയ്ത ഒരു പോർട്ടിൽ 127.0.0.1 ലേക്ക് കണക്റ്റ് ചെയ്തേക്കാം, ആ ശ്രോതാവ് GUI സെഷൻ നിലനിൽക്കുന്നിടത്തോളം മാത്രം നിലനിൽക്കും. ഫോർവേഡ് ഇല്ലാതെ localhost ലേക്ക് ചൂണ്ടുന്ന psql ന് VPN മായി ബന്ധമില്ലാത്ത ഒരു നിരസിച്ച കണക്ഷൻ ലഭിക്കുന്നു.

GUI യഥാർത്ഥത്തിൽ ഉപയോഗിക്കുന്ന എൻഡ്പോയിന്റ് വായിക്കുക

കണക്ഷന്റെ പ്രോപ്പർട്ടികൾ തുറന്ന് നാല് മൂല്യങ്ങൾ പകർത്തുക: ഹോസ്റ്റ്, പോർട്ട്, ഡാറ്റാബേസ്, റോൾ. തുടർന്ന് ടണൽ ടാബ് തിരയുക, കാരണം SSH ഫോർവേഡ് സ്വകാര്യ വിലാസത്തെ ലോക്കൽ പോർട്ടാക്കി മാറ്റുകയും psql-നോട് പറയേണ്ടത് മാറ്റുകയും ചെയ്യുന്നു.

SettingWhat the GUI holdsWhat psql uses when the value is absent
DestinationA saved hostname, sometimes behind a forwardA local Unix socket, not the remote endpoint
PortThe direct port or a forwarded local port5432, or the port from a service file
Role and databaseStored per connection profileYour operating-system user name
TLS identityIts own CA bundle and verification modeWhatever PGSSLMODE or the service file says
Startup filesNot read at allRead unless -X is passed

ഓരോ വരിയും വ്യത്യസ്ത പാളിയിൽ പരാജയപ്പെടുന്നു, നിങ്ങൾക്ക് ലഭിക്കുന്ന സന്ദേശം ആ പാളിയെ പേരിടുന്നു. സേവ് ചെയ്ത പ്രൊഫൈലിന്റെ സൗഹൃദ നാമം psql-ൽ ഒട്ടിക്കുന്നത് മുകളിലെ ഒരു മൂല്യവും കൊണ്ടുപോകുന്നില്ല, സേവന നാമം ടെർമിനൽ ഒരിക്കലും വായിച്ചേക്കാത്ത ഒരു ഫയലിലൂടെ പരിഹരിക്കപ്പെടുന്നു.

libpq നിങ്ങളുടെ ഷെല്ലിൽ നിന്ന് എന്താണ് പാരമ്പര്യമായി സ്വീകരിക്കുന്നത്

psql എന്നത് libpq-യുടെ മുകളിലുള്ള നേർത്ത ക്ലയന്റാണ്, libpq മറ്റെല്ലാറ്റിനും മുമ്പ് പരിസ്ഥിതി വായിക്കുന്നു. PGHOST, PGHOSTADDR, PGPORT, PGDATABASE, PGUSER, PGSERVICE, PGSSLMODE തുടങ്ങിയ വേരിയബിളുകൾക്ക് ഓരോന്നിനും കണക്ഷന്റെ ഒരു ഭാഗം വഴിതിരിച്ചുവിടാം. അവ ടൈപ്പ് ചെയ്യുന്നതിനു പകരം പാരമ്പര്യമായി ലഭിക്കുന്നു, അതിനാൽ നിങ്ങൾ പ്രവർത്തിപ്പിച്ച കമാൻഡിൽ ഒന്നും അവ കാണിക്കുന്നില്ല. എക്സ്പോർട്ട് ചെയ്ത PGSSLMODE ഉം കമാൻഡ് ലൈനിൽ ഒരു വാക്കുപോലുമില്ലാതെ ക്ലയന്റ് സ്വീകരിക്കുന്നത് മാറ്റിയേക്കാം.

ആ വേരിയബിളുകളിൽ രണ്ടെണ്ണം ആദ്യം സംശയത്തിന് അർഹമാണ്. PGHOSTADDR പേര് പരിഹരിക്കുന്നതിനെ മറികടക്കുന്ന ഒരു സംഖ്യാ ലക്ഷ്യം നൽകുന്നു, അതേസമയം ഹോസ്റ്റ് നാമം ഇപ്പോഴും സർട്ടിഫിക്കറ്റിന്റെ ഐഡന്റിറ്റി നിർണ്ണയിക്കുന്നു, PGSERVICE സേവന ഫയലിൽ നിന്ന് ഹോസ്റ്റ്, ഡാറ്റാബേസ്, TLS തിരഞ്ഞെടുപ്പുകൾ വലിച്ചെടുക്കുന്നു. ഇത് ഡീബഗ് ചെയ്യാൻ മുഴുവൻ പരിസ്ഥിതിയും ഡംപ് ചെയ്യുന്നത് മോശം ശീലമാണ്, കാരണം അതിൽ പാസ്വേഡുകളും ബന്ധമില്ലാത്ത ടോക്കണുകളും ഉണ്ടായേക്കാം; പകരം നിങ്ങൾക്ക് പ്രധാനമായ വേരിയബിളുകൾ തിരഞ്ഞെടുക്കുക.

host, hostaddr എന്നിവ രണ്ടും ഒഴിവാക്കുമ്പോൾ നെറ്റ്വർക്ക് വിലാസത്തിന് പകരം Unix ഡൊമെയ്ൻ സോക്കറ്റ് തിരഞ്ഞെടുക്കപ്പെടുന്നു. അതിനാൽ -h ഇല്ലാതെ psql വിളി പ്രാദേശികമായി വിജയിച്ചേക്കാം, അല്ലെങ്കിൽ സോക്കറ്റ് പിശകിൽ പരാജയപ്പെടാം, GUI ഉപയോഗിക്കുന്ന പാതയെ ഒരിക്കലും തൊടാതെ.

അതേ പാരാമീറ്ററുകൾ കൈകൊണ്ട് അയയ്ക്കുക

GUI മൂല്യങ്ങൾ കൈവശമുണ്ടെങ്കിൽ അവ വ്യക്തമായി കൈമാറുകയും ഓവർറൈഡുകൾ ചേർത്തേക്കാവുന്ന സ്റ്റാർട്ടപ്പ് ഫയൽ ഒഴിവാക്കുകയും ചെയ്യുക. താഴെയുള്ള കണക്ഷൻ സ്ട്രിംഗ് ഉദാഹരണമാണ്: എൻഡ്പോയിന്റ്, പോർട്ട്, ഡാറ്റാബേസ്, റോൾ എന്നിവ നിങ്ങളുടെ അഡ്മിനിസ്ട്രേറ്റർ അംഗീകരിച്ച മൂല്യങ്ങളാൽ മാറ്റി, ഇതിനകം പ്രവർത്തിക്കുന്ന വിശ്വാസ കോൺഫിഗറേഷൻ നിലനിർത്തുക.

psql -X "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5"

ആ കമാൻഡിലെ മൂന്ന് വിശദാംശങ്ങൾ ബോധപൂർവമാണ്. -X psql-ന്റെ സ്റ്റാർട്ടപ്പ് ഫയൽ അടക്കുന്നു, എന്നാൽ libpq പരിസ്ഥിതിയോ സേവന നിർവചനമോ അടക്കുന്നില്ല. connect_timeout=5 ഒരു ശൂന്യ പാത ടെർമിനലിനെ മിനിറ്റുകളോളം തൂക്കിയിടുന്നത് തടയുന്നു. sslmode=verify-full സർട്ടിഫിക്കറ്റ്, ഹോസ്റ്റ് നാമ പരിശോധനകൾ ഓണായി നിർത്തുന്നു, TLS പിശക് പ്രത്യക്ഷപ്പെടുമ്പോൾ ആളുകൾ ഓഫ് ചെയ്യുന്ന ഭാഗം അതു തന്നെയാണ്.

അംഗീകരിച്ച എൻഡ്പോയിന്റ് ഒരു pooler-ന്റെ പിന്നിലാണെങ്കിൽ, പോർട്ട് 6432 ഉം പോർട്ട് 5432 ഉം വ്യത്യസ്ത സെർവർ ഐഡന്റിറ്റികളിലൂടെ ഒരേ ഡാറ്റയിലെത്തിയേക്കാം, പരിശോധന ഡാറ്റാബേസിന്റെ പേരിലല്ല, pooler-ന്റെ പേരിൽ പരാജയപ്പെടാം. മോഡ് ദുർബലമാക്കുന്നതിനു പകരം കണക്ഷൻ സ്ട്രിംഗിലെ പേര് ശരിയാക്കുക.

അടുത്ത ഘട്ടം പിശക് സന്ദേശം തിരഞ്ഞെടുക്കട്ടെ

പരാജയത്തിന്റെ വാചകം ശ്രമം എത്ര ദൂരം പോയി എന്ന് പറയുന്നു, അത് ടണലിനെക്കുറിച്ചുള്ള ഏത് ഊഹത്തെക്കാളും മികച്ചതാണ്. പരിഹരിക്കാനാവാത്ത പേര് സോക്കറ്റ് ഉണ്ടാകുന്നതിന് മുമ്പേ പരാജയപ്പെടുന്നു, സമയപരിധി കഴിയുന്നത് പാതയോ ഫയർവാളോ പാക്കറ്റുകൾ ഉപേക്ഷിച്ചു എന്നാണ്, നിരസിക്കൽ എന്തോ ഉത്തരം നൽകി വിസമ്മതിച്ചു എന്നാണ്, പ്രാമാണീകരണ പിശക് നെറ്റ്വർക്ക് ഇതിനകം പ്രവർത്തിച്ചിരുന്നു എന്നാണ്.

psql -X -w "host=db.internal.example port=6432 dbname=orders user=report_ro sslmode=verify-full connect_timeout=5" -c '\conninfo'
env | grep -E '^PG'
psql --version

\conninfo ന്റെ ഔട്ട്പുട്ട് GUI യുടെ ലൈവ് സെഷനുമായി താരതമ്യം ചെയ്യുക: അതേ ഹോസ്റ്റ്, അതേ പോർട്ട്, അതേ റോൾ, അതേ TLS അവസ്ഥ. ഈ നാലെണ്ണം ഒത്തുപോയാൽ VPN-ന് വിശദീകരിക്കാൻ ഒന്നും ബാക്കിയില്ല. അവ ഒത്തുപോകുന്നതുവരെ, ടണലിലെ ഓരോ അധിക മാറ്റവും ടെർമിനൽ ഒരിക്കലും ഉണ്ടാക്കാത്ത ഒരു കണക്ഷനെക്കുറിച്ചുള്ള ഊഹമാണ്.

അനുബന്ധ ലേഖനങ്ങൾ