ฉันจะรันสคริปต์ทันทีหลังจากเชื่อมต่อผ่าน SSH ได้อย่างไร


24

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

<backstory>

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

ssh example.com -t 'tmux attach'

UTF-8 จะตัดการครอบตัดที่ไม่ครอบเมื่อทำการปอกเปลือกในปกติและเพียงแนบกับเซสชัน tmux ด้วยตนเอง

</ backstory>

ดังนั้นฉันจึงต้องการวิธีการเริ่มต้นใช้งานบางอย่างใหม่ในการเข้าสู่ระบบ ssh ซึ่งจะไม่ส่งผลกระทบต่อสิ่งอื่นใดที่ฉันได้กำหนดค่าไว้ใน.zshrc(หรือของคุณ.bashrcหากคุณยังใช้ bash) ที่อาจจำเป็นสำหรับสภาพแวดล้อมการพัฒนาของฉัน ปรากฏขึ้นเมื่อฉันทำงานในพื้นที่บนเครื่องที่กล่าวไว้เป็นครั้งคราว

คำตอบ:


13

เมื่อคุณเรียกssh example.comภูต SSH เริ่มต้นเปลือกเข้าสู่ระบบสำหรับคุณและเปลือกเข้าสู่ระบบอ่านของคุณ~/.profile(หรือ~/.bash_profileหรือ~/.zprofileหรือ~/.loginขึ้นอยู่กับเปลือกเข้าสู่ระบบของคุณ) เมื่อคุณระบุคำสั่งให้เรียกใช้จากระยะไกล (ไม่ว่าจะมีหรือไม่มี-t) ssh daemon จะเริ่มเชลล์ธรรมดาดังนั้นคุณ.profileจะไม่อ่าน วิธีการรักษา:

ssh example.com -t '. /etc/profile; . ~/.profile; tmux attach'

ส่วนใหญ่ภูต SSH LC_*มีการกำหนดค่าที่จะปฏิเสธการส่งตัวแปรสภาพแวดล้อมยกเว้น หาก ssh daemon example.comเปิดใช้งานคุณสามารถใช้LC_*ตัวแปรที่กำหนดเองเพื่อเริ่มต้น tmux โดยอัตโนมัติ - ใส่สิ่งนี้ลงใน~/.profile:

if [ -n "$LC_tmux_session" ] && tmux has -t "$LC_tmux_session"; then
  exec tmux attach -t "$LC_tmux_session"
elif [ -n "${LC_tmux_session+1}" ] && tmux has; then
  exec tmux attach
fi

จากนั้นเข้าสู่ระบบด้วยหรือLC_tmux_session= ssh example.comLC_tmux_session=session_name ssh example.com

คำตอบนี้มีข้อมูลเพิ่มเติมเกี่ยวกับการส่งผ่านตัวแปรสภาพแวดล้อมผ่าน ssh


เหตุผลที่ฉันไม่ได้ใช้ssh example.com -t 'tmux attach'ไม่ใช่เพราะมีปัญหาในการโหลดสภาพแวดล้อมของฉัน แต่เนื่องจากฉันมีปัญหากับการแสดงอักขระ UTF-8; ปัญหานี้ไม่มีอยู่เมื่อเชื่อมต่อในลักษณะปกติ นี่คือเหตุผลที่คำถามนี้เกี่ยวกับการเรียกใช้สคริปต์ทันทีหลังจากเชื่อมต่อผ่าน SSH
connrs

ฉันชอบทางออกของคุณ Elegant
connrs

@connrs: คุณมีปัญหากับ UTF-8 แม้ในขณะที่คุณใช้งาน.profileหรือไม่? ฉันสันนิษฐานว่าปัญหาเกิดจากการตั้งค่าภาษาในเครื่องเป้าหมายไม่ถูกต้อง/etc/profileหรือที่คุณ.profileกำหนดไว้ ปัญหาภาษาอาจแก้ไขได้ด้วยข้อมูลเพิ่มเติม
Gilles 'หยุดความชั่วร้าย'

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

6

ก่อนหน้านี้ฉันแนะนำให้ตั้งค่าPermitUserEnvironment yesและเพิ่มตัวแปรสภาพแวดล้อมในตัวคุณ~/.ssh/environmentจนกระทั่งEli Headyบิ่นด้วยคำแนะนำที่ดีกว่าในความคิดเห็นด้านล่าง

เปิดของคุณ.zlogin(ทุบตี: .bash_profileฯลฯ ) และใส่ต่อไปนี้:

if [[ "$SSH_CONNECTION" != "" && "$MY_SSH_CONNECTION" != "yes" ]]; then
    while true; do
        echo -n "Do you want to attach to a tmux session? [y/n]"
        read yn
        case $yn in
            [Yy]* ) MY_SSH_CONNECTION="yes" tmux attach; break;;
            [Nn]* ) break;;
            * ) echo "Please answer y/n";;
        esac
    done
fi

แรงบันดาลใจมาจาก: ฉันจะแจ้งให้ใส่ใน Linux shell script ได้อย่างไร

โปรดทราบว่าฉันใช้.zloginไฟล์นี้ แต่คุณสามารถใช้.zshrcไฟล์ของคุณได้แต่ฉันชอบที่จะทำให้ไฟล์ dotfiles เป็นระเบียบและแยกมันออกเพื่อให้ฉันสามารถใช้กับเครื่องอื่นได้

แทนที่คำถามด้วยสิ่งที่เหมาะสมสำหรับตัวคุณเองและแทนที่MY_SSH_CONNECTION="yes" tmux attachด้วยสิ่งที่คุณต้องการเรียกใช้ ณ จุดนั้น

สังเกตวิธีที่สคริปต์ตั้งค่าMY_SSH_CONNECTION="yes"ก่อนtmux attachส่งผ่านไปยัง tmux เนื่องจากจะเปิดเชลล์ที่จะเข้าถึงสคริปต์เดียวกันด้านบนและจะป้องกันการเรียกซ้ำ


2
การใช้ PermitUserEnvironment จะไม่สามารถทำได้ในบางสภาพแวดล้อมเนื่องจากความปลอดภัยที่อาจเกิดขึ้น SSH ตั้งค่าตัวแปร $ SSH_CONNECTION ซึ่งสามารถใช้แทน $ SSH_LOGIN ของคุณใน. zlogin ของคุณโดยไม่จำเป็นต้องใช้ ~ / .ssh / environment สิ่งที่if [[ "$SSH_CONNECTION" != "" ]]ควรทำ
Eli Heady

3

ตัวฉันเองฉันเพิ่มสิ่งนี้ลงในไฟล์. bash_profile ของฉัน:

if [ -z "$STY" ]; then
    reattach() { exec screen -A -D -RR ${1:+"$@"} ; }
fi
if [ -t 0 ]; then
    screen -wipe
    echo 'starting screen... (type Ctrl-C to abort)'
    sleep 5 && reattach
fi

นี่ทำให้ฉันมีเวลายกเลิกการติดตั้งซ้ำหรือสร้างเซสชันหน้าจอ มันจะไม่ทำงานในรูปแบบ 'คำสั่งระบบ ssh' (ซึ่งไม่ได้เรียกโปรไฟล์ ~ /.*) ฟังก์ชั่นเปลือกถูกตั้งค่าให้ใส่กลับเข้าไปใหม่หากฉันยกเลิก


ที่ดี! ฉันจัดการ f * สิ่งนี้ด้วยการใส่ bashrc แทนแล้วในแต่ละหน้าต่างหน้าจอใหม่ - เมื่อเปลี่ยนเป็น. profile มันก็ใช้ได้ดี
Hugo

0

คุณอาจพิจารณาวิ่ง

ssh remotehost -t screen -DR

และเรียกใช้เซสชันเทอร์มินัลของคุณที่นั่น จากนั้นคุณสามารถแยก ( ^A^D) และติดตั้งใหม่ในภายหลัง (จากไคลเอนต์อื่นเช่นกัน) มันจะทำให้ปัญหากับการเริ่มต้นที่ไม่ใช่แบบโต้ตอบหายไปเป็นหน้าจอเก็บเซสชันเทอร์มินัลแบบเต็ม (ตัวเลือกเข้าสู่ระบบเชลล์เช่นกัน, man screen(1) หรือ^A?)


ตามที่กล่าวไว้ในคำถามของฉันฉันใช้ tmux แทนหน้าจอ GNU เพื่อจัดการเซสชันของฉัน และเมื่อเต็มไปด้วย-t 'tmux attach'ฉันมีปัญหากับเสียงเรียกเข้าที่ไม่ปกติ นี่คือเหตุผลที่คำถามจริงเกี่ยวกับการเรียกใช้สคริปต์บน ssh เชื่อมต่อมากกว่าการจัดการหน้าจอ / เซสชัน ขอโทษที่ไม่ชัดเจนในคำถามของฉัน
connrs

ขออภัยคุณพูดถึง tmux แต่มันไม่ได้มีความหมายอะไรกับฉัน ขอบคุณที่กล่าวถึงเครื่องมือใหม่!
อิอิ

0

หากต้องการพูดคุยกับปัญหา UTF-8 โดยเฉพาะหากคุณเพิ่ม

SendEnv LANG

และ$LANGถูกตั้งค่าเป็นสิ่งที่ชอบen_US.UTF-8ในท้องถิ่นและ sshd ของคุณในระยะไกลช่วยให้SendEnvคำสั่ง (ด้วยAcceptEnvในsshd_config), tmux ที่ปลายอีกด้านควรให้เกียรติมัน ฉันมีปัญหานี้มาระยะหนึ่งแล้วและมันก็ยากที่จะแก้ไขปัญหา


0

หากคุณต้องการให้มันทำงานทุกครั้งที่คุณเชื่อมต่อคุณสามารถเพิ่มtmux attachที่ด้านล่างของ~/.profileเครื่องรีโมต

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