ორივე კლიენტი ერთსა და იმავე ლეპტოპზეა, ერთი და იმავე გვირაბში გადის და მათგან მხოლოდ ერთი უკავშირდება. ეს შედარება VPN-ის შერჩევითობის მტკიცებულებად ჩანს, თუმცა ბევრად უფრო გავრცელებული ახსნაა, რომ ორი კლიენტი სხვადასხვა დანიშნულების წერტილს უკავშირდება. GUI ინახავს საკუთარ ჰოსტს, პორტს, როლს და TLS პარამეტრებს და საჭიროებისას ჩუმად აშენებს SSH გადაგზავნას, ხოლო psql კავშირს აწყობს libpq-ის ნაგულისხმევი მნიშვნელობებიდან, რომლებიც თქვენმა shell-მა შეიძლება უკვე დააყენა. სამუშაო კავშირის გამეორება GUI-ის პარამეტრების წაკითხვაა და არა გვირაბის ხელახლა დაყენება.

მითი: ერთი მუშა კლიენტი გზას ამტკიცებს

თუ GUI უკავშირდება, გვირაბი ტრაფიკს გადაიტანს და ეს არის ერთადერთი, რასაც GUI ამტკიცებს. ის არაფერს ამბობს იმაზე, თუ რომელ მისამართს ხსნის psql, რომელი როლით ახდენს ავთენტიფიკაციას ან ტოვებს თუ არა მის მიერ გახსნილი სოკეტი მოწყობილობას. გზა საერთოა; პარამეტრები არა.

ლოკალური გადაგზავნა შუალედს აფართოებს. GUI შეიძლება დაუკავშირდეს 127.0.0.1-ს იმ პორტზე, რომელიც SSH-ით გადასცა, და ეს მსმენელი მხოლოდ 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 თქვენი shell-იდან

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-ის სახელზე და არა მონაცემთა ბაზისაზე. გაასწორეთ სახელი კავშირის სტრიქონში და არ დაასუსტოთ რეჟიმი.

ნება დართეთ შეცდომის შეტყობინებას აირჩიოს შემდეგი ნაბიჯი

ჩავარდნის ტექსტი ამბობს, რამდენად შორს მივიდა მცდელობა და ეს გვირაბის შესახებ ყველა ვარაუდს სჯობს. სახელი, რომელიც არ იხსნება, სოკეტის არსებობამდე ფერხდება, დროის ამოწურვა ნიშნავს, რომ მარშრუტმა ან firewall-მა პაკეტები ჩამოყარა, უარი ნიშნავს, რომ რაღაცამ უპასუხა და თავი შეიკავა, ხოლო ავთენტიფიკაციის შეცდომა ნიშნავს, რომ ქსელი უკვე მუშაობდა.

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-ს აღარაფერი რჩება ასახსნელი. სანამ ისინი არ დაემთხვევა, გვირაბის ყოველი დამატებითი ცვლილება ვარაუდია იმ კავშირზე, რომელიც ტერმინალს არასდროს გაუკეთებია.

დაკავშირებული სტატიები