प्रक्रिया प्रतिस्थापन क्यों नहीं है <() ssh -F के साथ काम करते हैं


11

मेरे पास कुछ योनि आभासी मशीनें हैं। उनमें लॉग इन करने के लिए मैं vagrant sshकमांड जारी करता हूं । मैं नियमित sshकमांड का उपयोग करके उनमें लॉग इन करना चाहता हूं । vagrant ssh-configउपयुक्त कॉन्फ़िग फ़ाइल आउटपुट

$ vagrant ssh-config
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2201
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /home/cbliard/.vagrant.d/insecure_private_key
  IdentitiesOnly yes
  LogLevel FATAL

जब इस कॉन्फिग को किसी फाइल में आउटपुट करना और इसके साथ प्रयोग करना ssh -F, सब कुछ ठीक काम करता है:

$ vagrant ssh-config > /tmp/config
$ ssh -F /tmp/config default
=> logged successfully

<(cmd)अस्थायी कॉन्फ़िगरेशन फ़ाइल के निर्माण को रोकने के लिए प्रक्रिया प्रतिस्थापन ऑपरेटर का उपयोग करते समय, यह विफल रहता है:

$ ssh -F <(vagrant ssh-config) default
Can't open user config file /proc/self/fd/11: No such file or directory

उपयोग करते समय एक ही त्रुटि होती है <(cat /tmp/config)

$ ssh -F <(cat /tmp/config) default
Can't open user config file /proc/self/fd/11: No such file or directory

मैं zsh का उपयोग कर रहा हूं और मैं बैश के साथ समान व्यवहार का पालन करता हूं। मुझसे यहां क्या गलत हो रहा है?


2
ऐसा लगता है कि ssh सभी अप्रत्याशित फ़ाइल डिस्क्रिप्टर को बंद कर रहा है।
सीटीएल-अल्ट-डेलोर

जवाबों:


10

आदेश:

ssh -F <(vagrant ssh-config) default

vagrantएक पाइप से जुड़े अपने स्टडआउट के साथ एक अलग प्रक्रिया में कमांड चलाता है । पाइप का दूसरा छोर फ़ाइल डिस्क्रिप्टर n(आपके मामले में यह 11 है) के रूप में एक नई प्रक्रिया से जुड़ा है जो चलती है sshऔर शेल चलती है:

ssh -F /proc/self/fd/n default

अब, यह तभी काम करता है जब sshस्टार्टअप पर इसकी फाइल डिस्क्रिप्टर बंद न हो।

दुर्भाग्य से, यह करता है।

यदि उपयोग किया जाता है zsh, तो एक विकल्प =(...)प्रक्रिया प्रतिस्थापन के रूप का उपयोग करना है जहां एक पाइप का उपयोग करने के बजाय और /proc/self/fd, यह एक अस्थायी फ़ाइल का उपयोग करता है।

या आप फ़ाइल डिस्क्रिप्टर का उपयोग कर सकते हैं जो sshबंद नहीं होता है। उदाहरण के लिए, यदि आप कुछ नहीं खिला रहे हैं ssh(यदि रिमोट कमांड स्टड से कुछ भी नहीं पढ़ रहा है) तो आप fd0, उदाहरण के लिए उपयोग कर सकते हैं :

vagrant ssh-config | ssh -F /dev/stdin -n default

1
आश्चर्यजनक। इसके साथ =(...)यह एक आकर्षण की तरह काम करता है और sshसत्र समाप्त होने पर अस्थायी फ़ाइल स्वचालित रूप से हटा दी जाती है। वैरिएंट /dev/stdinसफलतापूर्वक जोड़ता है लेकिन तुरंत बाहर निकलता है।
cbliard

1
@cbliard, हां, यदि आप दूसरे छोर पर जो कमांड चलाते हैं, वह एक इंटरेक्टिव शेल है, तो यह उसके स्टड (जो अब वेजाइनल तक पाइप का इस्तेमाल होता है) से पढ़कर ईओएफ और बाहर निकलता है। इसलिए मैं कह रहा था कि यदि आप कुछ नहीं खिला रहे हैंssh
स्टीफन चेज़लस

ठीक है, मुझे समझ में नहीं आया कि अगर आप कुछ भी नहीं खिला रहे हैं तो आपकाssh क्या मतलब है । यह अब स्पष्ट है।
cbliard

क्या यह अभी भी सच है? मैं सफलतापूर्वक उपयोग कर रहा हूं: ssh -F <(cat ~/.ssh/config ~/.ssh/hosts)SSH चलाते समय 2 कॉन्फिग फाइल को एक साथ जोड़ने के लिए। और ZSH पर, मैं यह कर सकता हूं ssh -F <(vagrant ssh-config) default:।
CMCDragonkai 13:14 बजे

1

@cbliard पर आधारित है

यह काम:

ssh -F =(vagrant ssh-config ) -i =(generate ssh-identity)

धन्यवाद! क्या आप स्पष्ट कर सकते हैं कि क्या =( )करता है? मैं इससे परिचित नहीं हूं।
cbliard
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.