రెండు క్లయింట్లు ఒకే ల్యాప్టాప్లో ఉన్నాయి, ఒకే సొరంగం గుండా వెళ్తాయి, వాటిలో ఒకటి మాత్రమే కనెక్ట్ అవుతుంది. ఆ పోలిక 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 వివరించడానికి ఏమీ మిగలదు. అవి సరిపోయే వరకు, సొరంగంలో ప్రతి అదనపు మార్పు టెర్మినల్ ఎప్పుడూ చేయని కనెక్షన్ గురించిన ఊహ.

సంబంధిత వ్యాసాలు