ฉันจะส่งผ่านตัวแปรสภาพแวดล้อมผ่านคำสั่ง ssh ได้อย่างไร [ซ้ำ]


42

ฉันจะส่งผ่านค่าไปยังคำสั่ง ssh ได้อย่างไรเช่นสภาพแวดล้อมที่เริ่มทำงานบนเครื่องโฮสต์เริ่มต้นด้วยตัวแปรสภาพแวดล้อมที่กำหนดไว้เพื่อการเลือกของฉัน

แก้ไข: เป้าหมายคือการส่งเดสก์ท็อป kde ปัจจุบัน (จาก dcop kwin KWinInterface currentDesktop) ไปยังเชลล์ใหม่ที่สร้างขึ้นเพื่อให้ฉันสามารถส่งตำแหน่ง nfs กลับไปยังอินสแตนซ์JEditของฉันบนเซิร์ฟเวอร์เดิมซึ่งไม่ซ้ำกันสำหรับแต่ละ KDE เดสก์ทอป (ใช้กลไกเช่นemacsserver / emacsclient )

เหตุผลที่อินสแตนซ์ของ ssh หลายรายการสามารถบินได้ในคราวเดียวก็เพราะเมื่อฉันตั้งค่าสภาพแวดล้อมของฉันฉันกำลังเปิดอินสแตนซ์ ssh ที่แตกต่างกันจำนวนมากไปยังเครื่องต่างๆ

คำตอบ:


17

~/.ssh/environmentไฟล์สามารถนำมาใช้กับตัวแปรชุดที่คุณต้องการใช้ได้สำหรับคำสั่งจากระยะไกล คุณจะต้องเปิดใช้งานPermitUserEnvironmentในการกำหนดค่า sshd

ตัวแปรที่ตั้งค่าด้วยวิธีนี้จะถูกส่งออกไปยังกระบวนการลูกดังนั้นคุณจึงสามารถ:

echo "Foo=Bar" > sshenv
echo "Joe=37" >> sshenv
scp sshenv user@server:~/.ssh/environment
ssh user@server myscript

และ myscript จะรู้ว่า Foo คือ Bar และ Joe คือ 37


3
ตัวแปรที่ต้องการเปลี่ยนที่อาจเกิดขึ้นทุกสาย SSH
รอสส์โรเจอร์ส

1
อาจดีกว่าที่จะอธิบายสิ่งที่คุณพยายามทำและเพราะอะไร อาจมีวิธีแก้ไขปัญหาอื่น ๆ ไฟล์สภาพแวดล้อมจะต้องมีการสร้างแบบไดนามิกในการโทรแต่ละ ssh ซึ่งไม่เป็นไปไม่ได้
EmmEff

จะมีการเปลี่ยนแปลงอย่างไร ค่าของตัวแปรเหล่านั้นหรือแม้แต่ชื่อของพวกเขา?
innaM

ยี้ ฉันลองวิธีนี้แล้ว แต่ฉันไม่สามารถเข้าถึงไฟล์ sshd config และวาง vars ใน ~ / .ssh / environment หรือ ~ / .ssh2 / environment ไม่ทำงาน ฉันเดาว่าฉันจะใช้ kludge โดยที่ฉันปล่อยตัวแปรนี้ไว้ในดิสก์ nfs แล้วตัดมันด้วยไฟล์ติดตั้ง ~ / .tcsh ของฉัน
Ross Rogers

2
คำตอบนี้ดูเหมือนจะไม่ตอบคำถามจริงๆ
intuited

55

SendEnvตัวเลือกของคุณผู้ชาย

~ / .ssh / config: (ภายในเครื่อง)

SendEnv MYVAR

/ etc / ssh / sshd_config: (ที่ปลายรีโมต)

AcceptEnv MYVAR

ทีนี้ไม่ว่าคุณค่าของ$MYVARโลคัลคืออะไรมันจะมีอยู่ในเซสชันระยะไกลด้วย
หากคุณลงชื่อเข้าใช้หลายครั้งแต่ละเซสชันจะมีสำเนาของตัวเอง$MYVARโดยอาจมีค่าแตกต่างกัน

~/.ssh/environmentมีวัตถุประสงค์เพื่อวัตถุประสงค์อื่น มันทำหน้าที่เป็น$ENVไฟล์เมื่อเรียกใช้คำสั่งที่ไม่ใช่เชลล์จากระยะไกล


6
ยังสามารถส่งผ่าน (เป็นประโยชน์มากขึ้น) ผ่านบรรทัดคำสั่งเป็นssh myserver -o SendEnv="MYVAR"ดังนั้นคุณสามารถทำให้มันเป็นแบบไดนามิกในสคริปต์
Mike Campbell

30

คุณสามารถส่งผ่านค่าด้วยคำสั่งที่คล้ายกับต่อไปนี้:

ssh username@machine VAR=value cmd cmdargs

คุณสามารถทดสอบด้วย:

ssh machine VAR=hello env

บน tcsh ต่อไปนี้ดูเหมือนว่าจะทำงาน:

ssh machine "setenv VAR <value>; printenv"

ดูเหมือนว่าจะทำงานได้ดีสำหรับสภาพแวดล้อมการทุบตี น่าเสียดายที่ฉันอยู่ในสภาพแวดล้อมขององค์กร tcsh
Ross Rogers

2
ฉันจะใช้เซสชันแบบโต้ตอบได้อย่างไร?
luckydonald

1
โปรดทราบว่าตัวอย่างแรกใช้ได้กับคำสั่งแรกเท่านั้นหากคุณกำลังเชื่อมคำสั่งเข้าด้วยกัน (พร้อม&&) ใช้ bash export VAR=value;แทน setenv ในรูปแบบที่สามใช้กับกรณีนี้
ข้อเสนอ

2
นี่คือสิ่งที่ฉันทำลงไป! ไม่ว่าคุณจะไปที่ไหนใช้สภาพแวดล้อมของคุณกับคุณ ssh user@host "$(<env_to_source.sh) command ..." ของคุณสามารถทำมันเหมือนว่า: ใน env to source ฉันมีexport var=value ; บรรทัดแยกกัน (จดจำเครื่องหมายอัฒภาค)
Tomasz Gandor

@TomaszGandor: หลายปีต่อมาก็ยังสมบูรณ์แบบ - ช่วยให้ฉันผ่านสิ่งที่ซับซ้อนเช่น PROMPT_COMMAND ไปที่นั่นโดยไม่ต้องกังวลเกี่ยวกับการหลบหนี :-) 1,000 ขอบคุณ
Red Pill

29

นอกจากนี้ยังมีแฮ็คที่น่ากลัวและน่ากลัว

หากสคริปต์ของคุณใช้ตัวแปรบนรีโมตปลายทาง (เช่นคุณสามารถตั้งชื่อสิ่งที่คุณต้องการ) คุณสามารถใช้ตัวแปรโลแคลในทางที่ผิด ตัวแปรใด ๆ ของแบบฟอร์ม LC_ * จะถูกส่งผ่านคำต่อคำโดยไม่มีข้อกำหนดสำหรับการกำหนดค่าใด ๆ

ตัวอย่างเช่นเรามีชุดเซิร์ฟเวอร์ป้อมปราการที่หนึ่งในลูกค้าของฉัน ฉันเกลียดที่จะต้องเชื่อมต่อกับมันเพียงเพื่อเชื่อมต่อกับเซิร์ฟเวอร์อื่น ... และเซิร์ฟเวอร์อื่น ... ทุกครั้ง ฉันมีสคริปต์ที่ทำงานเหมือน SSH ยกเว้นว่ามันฉลาด

โดยทั่วไปหาก LC_BOUNCE_HOSTS ตั้งค่ามันจะแยกมันในช่องว่างและลอกออกโฮสต์แรก จากนั้นก็จะตีกลับผ่านและเรียกใช้สคริปต์เดียวกัน บนโหนดปลายทางรายการนี้จะว่างเปล่าในที่สุดดังนั้นจึงรันคำสั่ง ฉันยังมีโหมดแก้ไขข้อบกพร่อง (ซึ่งยอดเยี่ยมในระหว่างปัญหาเครือข่าย) ซึ่งถูกกำหนดโดย LC_BOUNCE_DEBUG ตั้งแต่ ssh ส่งผ่านสิ่งเหล่านี้ไปให้ฉันอย่างน่าอัศจรรย์ฉันไม่ต้องทำอะไรนอกจากจดจำจุดสิ้นสุดของรายการโฮสต์ (ซึ่งฉันทำกับตัวเลือก -)

ฉันรู้สึกสกปรกทุกครั้งที่ใช้สิ่งนี้ แต่มันใช้ได้ทุกที่ที่ฉันลอง


2
ทำไมคุณต้องใช้บางอย่างเช่นนั้นแทนที่จะเป็นProxyCommandตัวเลือกในตัวของ OpenSSH แก้ไข~/.ssh/configและเพิ่มบล็อกที่ชอบHost *.example.com: ProxyCommand -ssh -W %h:%p bastionhostและปล่อยให้อุโมงค์เชื่อมต่อกับคุณ
Kirk Strauser

1
สำหรับอุโมงค์มันไม่ได้เลวร้ายนัก สำหรับ env vars เหตุผลสองประการคือหนึ่ง PermitUserEnvironment ต้องการการเข้าถึงของผู้ดูแลระบบเพื่อกำหนดค่าบนเซิร์ฟเวอร์เพื่อส่งผ่านโดยตรง การส่งผ่านบรรทัดคำสั่งนั้นยากมากที่จะหลบหนี สองป้อมปราการหลายแห่งจะต้องเด้งผ่านทำให้สิ่งนี้มีความซับซ้อนมากขึ้นโดยเฉพาะเมื่อไม่ชัดเจนจากโฮสต์ต้นทางที่พา ธ ไปยังโฮสต์ปลายทางบางแห่ง ง่ายกว่าที่จะพูดว่า: "bounce-ssh bast1 bast2 nodeX - rm -rf /" มากกว่าที่จะรักษาเส้นทางสำหรับการพัฒนาประชากรโฮสต์ในชุดของไฟล์ ssh-config
Jayson

จับดี !! วิเศษมากและสกปรกไปหน่อย !!
zw963

2
นี่มันช่างน่ากลัว ไชโย 👏
Pi Delport

1
นี่มันเยี่ยมมากจริงๆขอบคุณ! ผมเคยใช้มันสำหรับหนึ่งสับมากขึ้นดีชะมัด ! :)
lumbric

1
bla="MyEnvSelection=dcop"
ssh user@host "export $bla && ./runProg"

เมื่อทุบตีฉันทดสอบด้วย:

$ echo '#!/bin/sh' > readEnv.sh
$ echo 'echo "MyEnv: "$MyEnvFromSSH' >> readEnv.sh

$ scp readEnv.sh user@host:~/
$ bla="MyEnvFromSSH=qwert"
$ ssh user@host "export $bla && ./readEnv.sh"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.