ทำไมฉันต้องตั้งค่า env vars ใน tmux อีกครั้งเมื่อฉันแนบใหม่?


37

ฉันทำงานบน mac และ ssh / tmux เป็นหลักแนบกับเครื่อง Linux เพื่อทำงานของฉัน ฉันมี ssh-agent กำลังทำงานบนเครื่อง Linux ฉันมี

set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"

.tmux.confในของฉัน แต่เมื่อใดก็ตามที่ฉันแนบมากับเซสชั่นนี้ฉันต้องทำงาน

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

เพื่อให้หน้าต่าง tmux ใหม่$SSH_AUTH_SOCKตั้งค่าไว้ถูกต้อง ฉันไม่ต้องการทำเช่นนี้ ความคิดใด ๆ

ปรับปรุง

ฉันคิดว่าฉันอธิบายไม่ได้ดี นี่คือฟังก์ชั่นเชลล์ของฉันเพื่อเปิดเชลล์บนเครื่องระยะไกล:

sshh () {
    tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}

เมื่อ tmux รันคำสั่ง ssh นี้$SSH_AUTH_SOCKจะไม่ถูกตั้งค่าแม้ว่าจะถูกตั้งค่าในสภาวะแวดล้อมโลคัลของฉัน ถ้าฉันวางไว้ในสภาพแวดล้อมของ tmux ด้วยsetenvคำสั่งข้างต้นทุกอย่างทำงานได้ดี คำถามของฉันคือทำไมฉันต้องเรียกใช้คำสั่ง setenv เลย?

อัปเดต 2

ข้อมูลมากกว่านี้:

เมื่อฉันแนบกับเซสชันที่มีอยู่$SSH_AUTH_SOCKจะไม่ถูกตั้งค่าในสภาพแวดล้อม tmux (หรือสภาพแวดล้อมแบบโกลบอล)

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

หากฉันตั้งค่าด้วยตนเองสิ่งต่าง ๆ ใช้งานได้:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

หากฉันถอดและติดตั้งใหม่$SSH_AUTH_SOCKกลับไปที่ไม่ได้ตั้งค่า


นี่ไม่เกี่ยวกับ SSH เลยใช่ไหม? ตัวแปรสภาพแวดล้อมใดที่คุณมีในเชลล์ใหม่ผลลัพธ์ของenvคืออะไร
Hauke ​​Laging

คุณใช้เชลล์อะไรใน Mac? ทุบตี?
slm

@HaukeLaging มันเกี่ยวกับ tmux จริงๆ
Chris W.

@slm ฉันใช้ zsh
Chris W.

แล้วหน้าต่างที่มีอยู่ล่ะ พวกเขายังคงทำงานหรือไม่
Hauke ​​Laging

คำตอบ:


34

เมื่อฉันได้รับเงินรางวัลฉันจะโพสต์คำวิจารณ์ใหม่เพื่อความสมบูรณ์ - และเพื่อหลีกเลี่ยงการตั้งค่าผู้เยี่ยมชมด้วยปัญหาเดียวกันในเส้นทางที่ไม่ถูกต้อง:

Tmux จะลบตัวแปรสภาพแวดล้อม

หน้า man ของ Tmux ระบุว่า update-environment จะลบตัวแปร"ที่ไม่มีอยู่ใน environment environment [... ] ราวกับว่า -r ถูกกำหนดให้กับคำสั่ง set-environment"

เห็นได้ชัดว่าสิ่งที่ทำให้เกิดปัญหา ดูการตอบสนองของคริสด้านล่าง อย่างไรก็ตามฉันยังไม่สามารถจินตนาการได้ว่าตัวแปรจะหายไปอย่างไรใน "source environment" และยังใช้ได้ในหน้าต่าง tmux ที่สร้างขึ้นใหม่ ...


คำตอบก่อนหน้า:

การส่งต่อ SSH ทำงานอย่างไร

บนเครื่องระยะไกลให้ดูสภาพแวดล้อมของเชลล์หลังจากสร้างการเชื่อมต่อ SSH:

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

สิ่งสำคัญที่นี่คือ SSH_AUTH_SOCK ซึ่งปัจจุบันถูกตั้งค่าเป็นไฟล์บางไฟล์ใน / tmp หากคุณตรวจสอบไฟล์นี้คุณจะเห็นว่าเป็นซ็อกเก็ตโดเมน Unix และเชื่อมต่อกับอินสแตนซ์เฉพาะของ ssh ที่คุณเชื่อมต่อด้วย ที่สำคัญการเปลี่ยนแปลงนี้ทุกครั้งที่คุณเชื่อมต่อ

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

วิธีการแก้

เนื่องจากเรารู้ว่าปัญหาเกี่ยวข้องกับการรู้ว่าซ็อกเก็ตการตรวจสอบความถูกต้อง SSH ปัจจุบันนั้นอยู่ที่ไหนเรามาวางไว้ในที่ที่คาดเดาได้!

ในไฟล์. bashrc หรือ. zshrc ของคุณบนเครื่องระยะไกลให้เพิ่มรายการต่อไปนี้:

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

ฉันไม่คิดว่าคุณจะต้องใส่ 'คำสั่งปรับปรุงสภาพแวดล้อม' ใน tmux.conf ของคุณ ตามหน้า man , SSH_AUTH_SOCK ได้รับการคุ้มครองตามค่าเริ่มต้นแล้ว

เครดิต

การตอบสนองของฉันคือข้อความที่ตัดตอนมาจากการโพสต์บล็อกนี้โดยมาร์ค 'xb95' สมิ ธ ซึ่งอธิบายปัญหาเหมือนกันสำหรับหน้าจอ


ขอบคุณสำหรับการตอบกลับอย่างรอบคอบ คำถามของฉันไม่เกี่ยวกับการตั้งค่าของฉัน$SSH_AUTH_SOCKในเชลล์ใหม่ แต่เกี่ยวกับการตั้งค่า$SSH_AUTH_SOCKในหน้าต่าง tmux ใหม่ก่อน. bashrc / .zshrc มีที่มา
Chris W.

@ChrisW ฉันคิดว่าสคริปต์ควรใส่ในไฟล์ rc ของล็อกอินเชลล์ของคุณบนเครื่องรีโมต หากคุณเข้าสู่ระบบเปลือกใหม่จะมาจากกระบอกไม้ไผ่, SSH_AUTH_SOCK มีการเปลี่ยนแปลงและการส่งออก เมื่อคุณเริ่ม tmux มันจะสืบทอด SSH_AUTH_SOCK จากสภาพแวดล้อมพาเรนต์ เนื่องจากค่าของ SSH_AUTH_SOCK ตอนนี้ได้รับการแก้ไขแล้ว tmux ควรทำงานต่อไปในการเข้าสู่ระบบต่อไป ... บางทีฉันอาจเข้าใจผิดปัญหา
djf

ฉันเดาว่าความสับสนของฉันเกี่ยวกับสภาพแวดล้อมที่ ssh ทำงานโดย tmux ในบริบทของหน้าต่างใหม่ (เช่นtmux neww ssh somehost)
Chris W.

หนึ่งปัญหาด้วยวิธีนี้คือการเชื่อมต่อ SSH ที่ 2 SSH_AUTH_SOCKเครื่องจะเขียนทับค่าของ วิธีนี้ใช้ได้เฉพาะในขณะที่เซสชัน tmux เปิดผ่านการเชื่อมต่อ SSH ล่าสุด
phylae

12

ฉันคิดออก คำตอบสั้น ๆ ที่ฉันต้องการที่จะลบออกจากSSH_AUTH_SOCK update-environmentเนื่องจากมันอยู่ในรายการนั้นค่าจึงถูกพัดหายไปทุกครั้งที่ฉันติดตั้งใหม่ ขอบคุณ @djf สำหรับเบาะแส บิตสำคัญจากหน้าคู่มือ tmux (1) ในupdate-environmentส่วน:

ตัวแปรใด ๆ ที่ไม่มีอยู่ในสภาพแวดล้อมต้นทางจะถูกตั้งค่าให้ลบออกจากสภาพแวดล้อมเซสชัน (ราวกับว่า -r ถูกกำหนดให้กับคำสั่ง set-environment)


1
@ChrisW คุณกรุณาช่วยให้ชัดเจนยิ่งขึ้นได้หรือไม่ ฉันคิดว่าฉันมีปัญหาเดียวกัน: บางครั้งเอเจนต์หยุดทำงานเมื่อฉันใส่เซสชัน tmux อีกครั้ง มันมีเหตุผลบางอย่างที่การเชื่อมต่อ SSH เป็นเรื่องใหม่และเมื่อฉัน ssh มันจะเริ่มตัวแทนใหม่ ฉันต้องเปลี่ยนอะไรเพื่อให้มันใช้งานได้ ฉันหวังว่ามันเป็นสิ่งที่ฉันสามารถทำงานได้เนื่องจากฉันไม่ต้องการกำหนดค่าเครื่องใหม่ที่ฉันต้องการ - ตอนนี้ฉันมี wrapper ssh ที่เริ่ม tmux จากระยะไกลหรือคืนค่าการเชื่อมต่อที่มีอยู่ฉันอาจจะทำอะไรบางอย่างก่อนที่จะเรียกคืน tmux
sorin

@ChrisW บางครั้งคำตอบสั้น ๆ ก็ดี แต่คุณช่วยตอบสั้น ๆ หน่อยได้ไหม? ฉันกำลังดิ้นรนเพื่อให้มันใช้งานได้และไม่มีอะไรในโพสต์นี้ทำงานให้ฉัน
redbmk

@sorin @redbmk ขออภัยด้วย นี่เป็นบรรทัดเดียวที่ฉันต้องเปลี่ยน.tmux.confเพื่อให้ทำงาน: set -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" คุณเห็นปัญหาsshหรือตัวแปรสภาพแวดล้อมโดยทั่วไปหรือไม่
Chris W.

2

แทนที่จะใช้ tmux เพื่อจัดการกับ ssh-agent ของฉันฉันได้ทุบตีจัดการกับ:

### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

ฉันมีสิ่งนี้ใน ~ / bashrcของฉันและมันใช้งานได้ดี


$SSH_AUTH_SOCKมีการตั้งค่าอย่างถูกต้องในเปลือกหอยของฉัน แต่เมื่อฉันทำสิ่งที่ชอบtmux neww ssh somehostฉันจะได้รับแจ้งข้อความรหัสผ่านของฉันที่จะปลดล็อคกุญแจส่วนตัวของฉันเว้นแต่tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCKผมทำงาน
Chris W.

1

ผมตอบคำถามที่คล้ายกันใน StackOverflow https://stackoverflow.com/a/49395839/241025 เนื่องจากหน้านี้ปรากฏขึ้นเป็นครั้งแรกในการค้นหาโดย Google ของฉันฉันต้องการโพสต์รุ่นสรุปที่นี่

ในการรับแต่ละเซสชั่น tmux ให้มีชุดของตัวแปรสภาพแวดล้อมที่กำหนดเองคุณต้องเพิ่มค่าให้กับตัวแปรสภาพแวดล้อมต่อเซสชันของ tmux นี่คือตัวอย่างของวิธีการทำ

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

ขั้นตอนสุดท้ายของการส่งออก FOO อย่างชัดเจนเป็นสิ่งจำเป็นเพื่อให้บานหน้าต่างปัจจุบันจะรับตัวแปรสภาพแวดล้อม บานหน้าต่างหรือหน้าต่างถัดไปที่คุณสร้างสำหรับเซสชัน tmux นี้จะสืบทอด FOO แต่จะไม่ปรากฏในเซสชันอื่น


0

คำอธิบายของ djf นำเสนอวิธีแก้ปัญหาอื่นที่เป็นไปได้ในใจของฉัน:

ก่อนtmux/ screenกำลังทำงาน:

  1. เข้าสู่ระบบ.
  2. ssh-agentเริ่มตัวอย่างของ
  3. เริ่มต้นtmux/ screenกับตัวแปรสภาพแวดล้อม (s) ssh-agentสำหรับเรื่องนี้

สิ่งนี้ไม่สามารถใช้การส่งต่อ SSH ไปยังไคลเอนต์ แต่ไม่ได้ถาม


1
ssh-agentไม่ได้ผูกกับ TTY ทำไมมันควรจะถูกฆ่าตายในการออกจากระบบ (?) - ทำไมใช้nohup?
poige

@poige ถูกต้อง
Hauke ​​Laging
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.