ฉันจะเปิดใช้เซสชันของหน้าจอด้วยคำสั่งผ่าน ssh บนเซิร์ฟเวอร์ระยะไกลจากเดสก์ท็อปของฉันได้อย่างไร


57

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

ดังนั้นความชัดเจน

ssh root@my.machine screen "tail -f /var/log/messages"

(เป็นตัวอย่าง) ใช้งานไม่ได้และให้

Must be connected to a terminal.

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


ในฐานะที่เป็นกันคุณสามารถตีข้อผิดพลาดนี้ไม่ได้ผ่านการใช้หน้าจอ ฉันมีฟังก์ชั่นเชลล์ที่กำลังทำ exec <foo ให้อ่านจากไฟล์ ต่อมาในสคริปต์ขนาดใหญ่ฉันพยายามเปิดหน้าจอ วิธีการทั้งหมดด้านล่าง obv ล้มเหลวเนื่องจากผู้ร้ายตัวจริงคือผู้บริหาร หนึ่งที่ต้องคำนึงถึง ตรวจสอบว่าคุณไม่ได้ฆ่า stdin ของคุณเองโดยไม่ตั้งใจ
Neil McGill

คำตอบ:


77

ลองใช้ตัวเลือก -t เพื่อ ssh

ssh -t root@my.machine screen "tail -f /var/log/messages"

จากผู้ชาย ssh

-t Force การจัดสรรหลอก tty สิ่งนี้สามารถนำมาใช้เพื่อรัน arbi-
        โปรแกรมที่ใช้หน้าจอ trary บนเครื่องระยะไกลซึ่งสามารถ
        มีประโยชน์มากเช่นเมื่อใช้บริการเมนู หลายครั้ง
        ตัวเลือกบังคับให้มีการจัดสรร tty แม้ว่า ssh จะไม่มี tty โลคอล

ฉันพยายามเหมือนกันกับ tmux ssh -t user@machine tmux attachและฉันสามารถแนบเซสชั่น tmux ระยะไกล แต่มันยุ่งกับการเข้ารหัสตัวละคร มันจะแสดงเฉพาะ ascii chars มีการแก้ไขสำหรับสิ่งนี้หรือไม่?
Macario

1
@Macario คุณอาจต้องการเปิดคำถามแยกต่างหากสำหรับสิ่งนี้ในขณะที่มันมีความสัมพันธ์แบบสัมผัสเมื่อคุณใช้มันด้วย ssh -t ดูเหมือนว่าจะเกี่ยวข้องกับการตั้งค่า LC_ * แตกต่างกันสำหรับการทำงานแบบโต้ตอบและไม่โต้ตอบ เมื่อคุณส่งบรรทัดคำสั่งไปยัง ssh เพื่อดำเนินการมันจะถูกดำเนินการกับสภาพแวดล้อมที่ไม่โต้ตอบ อาจเป็นไปได้ว่ามันขาดตัวแปรสภาพแวดล้อม TERM ที่ถูกส่งผ่านเมื่อเรียกใช้งานแบบไม่โต้ตอบซึ่งในกรณีนี้ tmux จะไม่ทราบว่าความสามารถในการทำงานของเทอร์มินัลของคุณนั้นมีอยู่จริง
Kjetil Joergensen

ฉันไม่ได้ใช้ ssh แต่กำลังเผชิญปัญหาเดียวกัน กรุณาช่วย. serverfault.com/questions/861632/unable-to-run-code-in-screen
zhangjinzhou

32

คุณสามารถใช้ได้:

ssh root@host screen -m -d "tail -f /var/log/messages"

ที่เริ่มต้นหน้าจอเดี่ยวพร้อมคำสั่งที่ทำงานอยู่

   -m   causes screen  to  ignore  the  $STY  environment  variable.  With
        "screen  -m"  creation  of  a  new session is enforced, regardless
        whether screen is called from within  another  screen  session  or
        not.  This  flag has a special meaning in connection with the `-d'
        option:

   -d -m   Start screen in "detached" mode. This creates a new session but
           doesn't  attach  to  it.  This  is  useful  for  system startup
           scripts.

1
คำตอบของคุณก็ดีไม่แพ้กันฉันก็ต้องเลือก อาจมีบางคนควรแก้ไขคำตอบแรกและเพิ่มข้อมูลของคุณ
Thomas Vander Stichele

8

ปลายตอบ แต่นี่คือสิ่งที่ฉันทำฉันทำนามแฝง (ลองเรียกมันว่า t) ทำสิ่งนี้:

ssh $MYSERVER -a -x -t screen -xRR -A -e^Zz -U -O

สิ่งนี้บอกsshให้ปิดการใช้งานเอเจนต์และการส่งต่อ X11 และบอกscreenให้แนบกับเซสชันที่กำลังทำงานเริ่มต้นใหม่หากจำเป็นใช้^Zเป็นคำสั่ง breakout ใช้ UTF-8 และฉลาดเกี่ยวกับเทอร์มินัล

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

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


1
ฉันอ่านหลายหน้าไม่ตอบคำถามที่ฉันมองหา แต่คุณจับมัน ฉันสมมติว่าหน้าจอหรือ tmux น่าจะอยู่ในเซิร์ฟเวอร์ส่วนใหญ่ในปัจจุบันและสิ่งที่ฉันเชื่อมต่อด้วยอาจเกิดขึ้นชั่วคราวดังนั้นฉันจึงไม่ต้องการยุ่งกับ bashrc อย่างที่คำตอบส่วนใหญ่แนะนำ คุณยังสามารถทำให้ฟังก์ชั่นนี้ในเชลล์ของคุณและยอมรับข้อโต้แย้งเช่น $ host และ $ command (ซึ่งคุณจะใส่ในตอนท้าย) และแทนที่จะเข้ารหัสรหัสนามแฝงของคุณtซึ่งเป็นโฮสต์เดียวคุณสามารถรวมกับชื่อโฮสต์ใน ssh_config ของคุณ
dragon788

@ dragon788 แน่นอนฉันทำให้มันเป็นฟังก์ชั่นในขณะนี้และแทนที่ $ MYSERVER ด้วย "$ @" ฉันยังคงใช้อันนี้มาก
w00t

4

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

ฉันพบว่ามันมีประโยชน์มาก:

if [ -n "$SSH_CONNECTION" ] && [ -z "$SCREEN_EXIST" ]; then
    export SCREEN_EXIST=1
    screen -DRi
fi

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