কীভাবে SSH সেশনে tmux স্বয়ংক্রিয়ভাবে শুরু করবেন?


92

আমার দশ বা ততটি সার্ভার রয়েছে যে আমি নিয়মিত এসএসএইচের সাথে সংযুক্ত থাকি। প্রত্যেকেরই আমার স্থানীয় কম্পিউটারের ~/.ssh/configফাইলটিতে একটি এন্ট্রি রয়েছে ।

আমার ইন্টারনেট সংযোগ অবশ্যম্ভাবীভাবে কমে গেলে আমার চলমান প্রক্রিয়াটির নিয়ন্ত্রণ হারাতে এড়াতে আমি সর্বদা একটি tmuxসেশনের অভ্যন্তরে কাজ করি । আমি প্রতিবার এসএসএইচ সংযোগ শুরু হওয়ার সাথে সাথে টিএমউক্সটি স্বয়ংক্রিয়ভাবে সংযুক্ত হওয়ার একটি উপায় চাই, যাতে tmux attach || tmux newআমি এসএসএইচ-এর পরে সর্বদা টাইপ করতে হয় না।

দুর্ভাগ্যক্রমে এটি এতটা সহজ হয়ে উঠছে না যতটা আমি প্রাথমিকভাবে আশা করি।

  • আমি ~/.bashrcসার্ভারগুলিতে কোনও কমান্ড যুক্ত করতে চাই না কারণ আমি এটি কেবল এসএসএইচ সেশনের জন্য চাই, স্থানীয় সেশনগুলির জন্য নয়।
  • সার্ভারগুলিতে যুক্ত tmux attach || tmux newকরার ফলে সংযোগের পরে ~/.ssh/rcত্রুটি not a terminalছুঁড়ে ফেলার ফলস্বরূপ ফলাফলটি পাওয়া যায় এমনকি RequestTTY forceআমার স্থানীয় এসএসএইচ কনফিগারেশন ফাইলে সেই সার্ভারের জন্য লাইনে বিকল্পটি যুক্ত করা হয়।

4
যেহেতু এটি একটি জনপ্রিয় প্রশ্ন হিসাবে অব্যাহত রয়েছে এবং বিশেষভাবে উল্লেখ করা হয়েছে ~/.ssh/config: আপনারা এখানে আসছেন বেশিরভাগই সম্ভবত প্রথম পাঁচটি উত্তর খুঁজছেন না, তবে ষষ্ঠীর জন্য ( স্ট্যাকওভারফ্লো . com / a / 52838493 / 5354137 )। কোনও যুক্তিসঙ্গত সাম্প্রতিক tmuxসংস্করণ সহ এটিও জিনিসগুলি করার সবচেয়ে বুদ্ধিমান উপায়।
সিক্সটিফাইভ

উত্তর:


90

সার্ভার-সাইড কনফিগারেশন:

সাধারণভাবে এসএসএইচ (এবং কেবল এসএসএইচ) এর মাধ্যমে লগ ইন করার সময় স্বয়ংক্রিয়ভাবে আপনার রিমোট সার্ভারে tmux শুরু করতে, ~/.bashrcসেই অনুসারে রিমোট সার্ভারে আপনার ব্যবহারকারী বা রুট (বা উভয়) এর সম্পাদনা করুন:

if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]]; then
  tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux
fi

এই কমান্ডটি একটি টিএমউक्स সেশন তৈরি করে যার নাম ssh_tmuxনা থাকলে এটি উপস্থিত থাকে বা সেই নামটি নিয়ে ইতিমধ্যে বিদ্যমান সেশনে পুনরায় যুক্ত হয়। আপনার সংযোগ হ্রাস পেয়েছে বা আপনি যখন সপ্তাহ আগে একটি সেশন ভুলে গেছেন, প্রতিটি এসএসএইচ লগইন স্বয়ংক্রিয়ভাবে আপনাকে পিছনে ফেলে থাকা tmux-ssh সেশনে ফিরিয়ে আনবে।

আপনার ক্লায়েন্ট থেকে সংযুক্ত:

বিশেষ কিছু না, ঠিক ssh user@hostname


4
আমি এই জন্য খুঁজছেন ছিল, এছাড়াও আমি খুব খুঁজেছেন similiar কোড এক টুকরা কিছু সময় আগে ব্যবহৃত হয়েছে, কিন্তু অধিবেশন ব্যবহারকারীর নাম ছিল (পরিবর্তন ssh_tmuxকরার জন্য $USER)
Iacchus

4
Moneytoo দেখি উত্তর উপর দরকারী মন্তব্যের জন্য $SSH_TTYবনাম $SSH_CONNECTIONখুব।
মিঃ তাও

4
আপনি আরও সংক্ষিপ্ততর tmux new-session -A -s ssh_tmuxপ্রতিস্থাপন করতে ব্যবহার করতে পারেন tmux attach-session -t ssh_tmux || tmux new-session -s ssh_tmux, যদি আরও কিছু বিভ্রান্তিকর থাকে তবে -Atmux কে ইতিমধ্যে উপস্থিত থাকলে সেশনটি সংযুক্ত করতে বলে
গ্রেডিয়েন্ট

4
"স্কিপ" না ভাঙতে, আপনাকে এটি পরীক্ষা করতে হবে এটি ইন্টারেক্টিভ শেল if [[ -n "$PS1" ]] && [[ -z "$TMUX" ]] && [[ -n "$SSH_CONNECTION" ]];
কিনা

4
@ জানফ্রোড নির্ভর করে না $PS1, [[ $- == *i* ]]পরিবর্তে ব্যবহার করুন, কারণ PS1 সংজ্ঞায়িত হতে পারে এমনকি এটি ইন্টারেক্টিভ শেল না হলেও।
এনরিকো

53

ঠিক আছে, আমি বেশিরভাগ সন্তোষজনক সমাধান পেয়েছি। আমার লোকালতে ~/.bashrcআমি একটি ফাংশন লিখেছিলাম:

function ssh () {/usr/bin/ssh -t $@ "tmux attach || tmux new";}

প্রদত্ত আর্গুমেন্টগুলির সাথে বিল্ট-ইন এসএস প্রোগ্রামটি কল করতে মূলত ssh টার্মিনাল ফাংশনটি ওভাররাইট করে "tmux attach || tmux new"

( $@কমান্ড লাইনে প্রদত্ত সমস্ত যুক্তি বোঝায়, তাই এতে ssh -p 123 user@hostnameপ্রসারিত হবে ssh -t -p 123 user@hostname "tmux attach || tmux new")

( -tআর্গুমেন্টটি RequestTTY Forcetmux কমান্ডের সমতুল্য এবং প্রয়োজনীয়)


22
যদি আপনার সংস্করণটিকে tmuxসমর্থন করে তবে এটি ব্যবহার করে বিবেচনা করুন tmux new -A fooযা fooসম্ভব হলে নামের একটি বিদ্যমান সেশনে সংযুক্ত হবে , প্রয়োজনে এটি তৈরি করুন। এটি আপনাকে আপনার ক্রিয়াকে সহজ করতে দেয় /usr/bin/ssh -t "$@" tmux new -A(এবং উদ্ধৃতিতে নিশ্চিত হন $@)।
চিপনার

4
দ্রষ্টব্য: আপনি নিয়মিতভাবে সংযুক্ত কিছু মেশিনে টিএমাক্স ইনস্টল না থাকলে আপনি বলতে function sshtবা পছন্দ করতে পারেন যাতে আপনি sshসাধারণত ব্যবহার চালিয়ে যেতে পারেন । অন্যথায়, /usr/bin/sshযখনই tmux ছাড়াই কোনও মেশিনের সাথে সংযোগ করা যায় তখনই কমান্ড প্রম্পটে টাইপ করুন :)
অ্যালেক্স রায়ান

4
আপনি যদি অলস হন তবে আপনার সাথে দূরবর্তী টিএমউক্স সেশনগুলি সংযোগ করতে আপনি কেবল ssht ব্যবহার করতে পারেন । OS X এর ব্যবহারকারীদের করতে চোলাই মাধ্যমে এটি টোকা এবং Linux ব্যবহারকারীরা এর মাধ্যমে একটি প্যাকেজ তৈরি করতে পারেন FPM এই সঙ্গে Makefile নামক বা শুধু কপি sshtকরতে ~/bin
brejoc

4
হাহা সুন্দর! এই ব্যাশটি ওয়ান-লাইনারটিকে পুরো গিথুব রেপোতে মেকফিলস এবং ব্রু এবং এই জাতীয় তবে হেই, আরও সহজ করার চেয়ে ওভারকিলের মতো মনে হচ্ছে!
অ্যালেক্স রায়ান

4
সমাধান হয়েছে:ssh -t user@hostname "LANG=$LANG tmux attach || tmux new"
অ্যালেক্স

23

সংযোগ:

ssh user@host -t "tmux new-session -s user || tmux attach-session -t user"

অধিবেশন চলাকালীন:

ব্যবহারের Ctrl+dজন্য ফিনিস অধিবেশন (tmux উইন্ডো বন্ধ) অথবা Ctrl+b dকরতে অস্থায়ী আলাদা এবং সেশনের থেকে পরে আবার এটিতে সংযোগ।

মনে আছে! যদি আপনার সার্ভারটি পুনরায় চালু করা সেশনটি হারিয়ে যায়!

আপনি যে কোনও সময় tmux এর ভিতরে থাকলে আপনি সেশন তালিকাCtrl+b s দেখতে এবং অন্যটিতে বর্তমান স্যুইচ করতে ব্যবহার করতে পারেন ।

আপনার .bashrc ঠিক করুন:

আমি আপনাকে সর্বজনীন ফাংশনটি সংজ্ঞায়িত করার পরামর্শ দিচ্ছি আপনার .bashrc:

function tmux-connect {
    TERM=xterm-256color ssh -p ${3:-22} $1@$2 -t "tmux new-session -s $1 || tmux attach-session -t $1"
}

এটি 22ডিফল্টরূপে পোর্ট ব্যবহার করে। আপনার দ্রুত সংযোগযুক্ত এলিয়াসগুলিও সংজ্ঞায়িত করুন:

alias office-server='tmux-connect $USER 192.168.1.123'
alias cloud-server='tmux-connect root my.remote.vps.server.com 49281'

পাসওয়ার্ড ছাড়াই লগইন করুন:

এবং আপনি যদি স্বয়ংক্রিয়ভাবে লগইন.ssh করতে কী উত্পন্ন করার চেয়ে পাসওয়ার্ড টাইপ করতে না চান :

ssh-keygen -t rsa
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa

আপনার সর্বজনীন কীটি দূরবর্তী হোস্টের কাছে রাখুন:

ssh-copy-id -p <port> user@hostname

অতিরিক্ত টিপস:

আপনি যদি অস্থায়ী সেশন-আইডি ব্যবহার করতে চান যা স্থানীয় বাশ সেশনের সাথে টিএমউक्स আইডি হিসাবে ব্যবহার করে :

SID=$USER-$BASHPID
ssh user@host -t "tmux new-session -s $SID || tmux attach-session -t $SID"

4
একটি ঝরঝরে কৌতুক এড়াতে যে ||কিছু ব্যবহার-মামলায় অন্তর্ভুক্ত করা হয় new-sessionমধ্যে .tmux.confএবং মাত্র সবসময় ব্যবহার tmux a -t 0
ফ্লোরিয়ান ওয়েনডেলবোন

4
Tmux এর নতুন সংস্করণগুলিতে আপনি এটি ব্যবহার করতে পারেন tmux new-session -Aযা সংযুক্ত করবে যদি এটি উপস্থিত থাকে অন্যথায় এটি একটি নতুন তৈরি করে।
ড্রাগন 788

15

আমি @kingmeffisto থেকে লাইনগুলি ব্যবহার করেছি (আমাকে তার উত্তরটি মন্তব্য করার অনুমতি নেই) এবং আমি একটি প্রস্থান যুক্ত করেছি যাতে tmux সমাপ্ত করে এসএসএস সংযোগও বন্ধ করে দেয়। এটি তবে এসএফটিপি সেশনগুলিকে ভেঙে দিয়েছে তাই আমাকে $SSH_TTYপরিবর্তে চেক করতে হয়েছিল $SSH_CONNECTION

সম্পাদনা 4/2018: জবাবদিহির [[ $- =~ i ]]মতো সরঞ্জামগুলিতে কাজ করার অনুমতি দেওয়ার জন্য ইন্টারেক্টিভ টার্মিনালের জন্য পরীক্ষা যুক্ত করা হয়েছে ।

if [ -z "$TMUX" ] && [ -n "$SSH_TTY" ] && [[ $- =~ i ]]; then
    tmux attach-session -t ssh || tmux new-session -s ssh
    exit
fi

14

এই ব্লগ পোস্টে বর্ণিত হিসাবে আপনি ssh করতে পারেন এবং তারপরে একটি একক কমান্ডের সাথে একটি বিদ্যমান টিএমউक्स সেশনে সংযুক্ত করতে পারেন:

ssh hostname -t tmux attach -t 0

আমার উত্তরটি সেটাই দেয় (যদিও আমি এটি ব্যবহার করি tmux attach || tmux newযাতে প্রতিটি সংযোগের জন্য একটি নতুন টিএমউक्स সেশন তৈরি না হয়)। জটিল অংশটি হ'ল সঠিক কমান্ডটি হ'ল ssh -t user@host tmux attach || tmux newএবং কমান্ড স্ট্রিংয়ের অভ্যন্তরে আর্গুমেন্টের প্রয়োজন এমন কিছু উপকরণের একমাত্র উপায় হ'ল আমি উপরে যেমনটি করেছি তেমন একটি নতুন ফাংশন তৈরি করা।
অ্যালেক্স রায়ান

আমি জানি, তবে কিছু লোক (আমার মতো) একটি ওয়ান-লাইনার পছন্দ করতে পারে যা কোনও ফাংশন সংজ্ঞায়িত করার সাথে জড়িত না
ফ্যাবিয়ান পেড্রেগোসা

4
এটি '0' নামক একটি সেশনে সংযুক্ত হয়। এটি হ'ল সাধারণ ফর্মটি হলssh [hostname] -t tmux attach -t [sessionName]
ডেভিড ডরিয়া

4
এটি আমার জন্য সত্যিই খুব ভালভাবে কাজ করেছে .. এটি মিশ্রিত করবে unix.stackexchange.com/a/116674 .. সুতরাং এখন আমার পুট্টি জিইউআই দেখতে এই রকম .. imgur.com/uFhxN30 । আমি Cntrl + b + d দিয়ে সেশনগুলি সংযোগ বিচ্ছিন্ন করতে পারি। খুব সহজ এবং সুবিধাজনক ..
alpha_989

14

রিমোট মেশিনে tmux 3.1 বা আরও নতুন

আপনার স্থানীয় ভিতরে ~/.ssh/config, লিখুন:

Host myhost
  Hostname host
  User user
  RequestTTY yes
  RemoteCommand tmux new -A -s foobar

সম্পর্কিত নয়, তবে আপনি যদি নন-এসসিআইআই অক্ষরগুলি নিয়ে কাজ করে থাকেন তবে আমি tmux -u …যথাযথ পরিবেশের ভেরিয়েবল সেট নেই এমন মেশিনগুলিতেও ইউনিকোড সমর্থন স্পষ্টভাবে সক্ষম করার জন্য এটির পরিবর্তনের পরামর্শ দেব ।

রিমোট মেশিনে tmux 3.0a বা তার বেশি পুরানো

উপরের মত প্রায় একই, তবে শেষ লাইনটি এতে পরিবর্তন করুন:

  RemoteCommand tmux at -t foobar || tmux new -s foobar

20 2020-10-29 হিসাবে, tmux 3.1 বা আরও নতুন দিয়ে শিপিংয়ের বিতরণের তালিকা ইতিমধ্যে বেশ দীর্ঘ।

² এর newজন্য ছোট new-session

³ at-এর সংক্ষিপ্ত রূপ attach-session


দূরবর্তী authorized_keysফাইলটি ব্যবহার করে বিকল্প পদ্ধতি :

যদি ~/.ssh/configকোনও কারণেই আপনার কাছে ফাইল না থাকে বা দূরবর্তী মেশিনটি সংযোগকারী মেশিনটিকে সেশনে সংযোগ / খুলতে বাধ্য করতে চায় তবে এটি আপনার দূরবর্তীটিতে যুক্ত করুন ~/.ssh/authorized_keys:

command="tmux at -t foobar || tmux new -s foobar" pubkey user@client

এটি অবশ্যই প্রাসঙ্গিক ব্যক্তিগত কী ইনস্টল থাকা সমস্ত ক্লায়েন্টের কাছ থেকে কাজ করবে যা আপনি যা চান তার উপর নির্ভর করে একটি আপ- বা ডাউনসাইড হতে পারে। ঝুঁকি রয়েছে যে, কিছু ভুল হওয়ার পরে, আর সংযোগ স্থাপন করা সম্ভব নাও হতে পারে।


এর tmux atপরিবর্তে কেন tmux a? এছাড়াও এটির জন্য একটি নামযুক্ত সেশনটি ব্যবহার করা বুদ্ধিমানের কাজ হবে বা হোস্টে লগ ইন করার পরে tmux "এলোমেলো" বিদ্যমান সেশনগুলির সাথে সংযুক্ত করবে।
এরিক

আপনি কীভাবে tmux সেশন স্থগিত করবেন? মারার পরে ssh কিন্ডদা লিম্বো অবস্থায় চলে যায় Ctrl+A Ctrl+Z
এরিক

এটি কেবল সংযোগ বিচ্ছিন্ন করে। যতদূর আমি উদ্বিগ্ন, এটিই এমন আচরণ যা আমি প্রত্যাশা করব এবং এতে সন্তুষ্ট।
সিক্সটিফাইভ

4
Ctrl-B Dতুলনায় ট্রিট কাজ করে Ctrl-B Ctrl-Z। ধন্যবাদ!
এরিক

4
এটি ইমো, সর্বাধিক ভোট দেওয়া উত্তর হওয়া উচিত। আমি ঠিক (2) খুঁজছিলাম।
সিডুয়েট

1

বাইবু টিএমএক্স / স্ক্রিনের জন্য একটি দুর্দান্ত দরকারী মোড়ক। উপস্থিত থাকলে বা একটি নতুন একটি তৈরি করে থাকলে বিদ্যমান সেশনে সংযোগ স্থাপন করে।

আমি এটি অটোশ দিয়ে ব্যবহার করি যা প্রশংসাপূর্ণভাবে এসএস সেশনটিকে পুনরায় সংযুক্ত করে। আন্তঃসন্তান সংযোগ সমস্যাগুলির ক্ষেত্রে উচ্চ প্রস্তাবিত।

function ssh-tmux(){
  if ! command -v autossh &> /dev/null; then echo "Install autossh"; fi
  autossh -M 0 $* -t 'byobu || {echo "Install byobu-tmux on server..."} && bash'
}

1

আপনি এটি দরকারী খুঁজে পেতে পারেন - একটি লুপে ssh ব্যবহার করে এবং একটি বিদ্যমান টিএমউक्स সেশনে পুনরায় সংযোগ স্থাপন করে বা সংযোগ স্থাপন করে যাতে আপনার নেটওয়ার্ক বিভাজনের পরে পুনরায় সংযোগ করার একটি দুর্দান্ত সহজ নির্ভরযোগ্য উপায় রয়েছে

#!/bin/bash
#
# reconnect to or spawn a new tmux session on the remote host via ssh.
# If the network connection is lost, ssh will reconnect after a small
# delay.
#

SSH_HOSTNAME=$1
TMUX_NAME=$2
PORT=$3

if [[ "$PORT" != "" ]]
then
    PORT="-p $PORT"
fi

if [ "$TMUX_NAME" = "" ]
then
    SSH_UNIQUE_ID_FILE="/tmp/.ssh-UNIQUE_ID.$LOGNAME"

    if [ -f $SSH_UNIQUE_ID_FILE ]
    then
        TMUX_NAME=`cat $SSH_UNIQUE_ID_FILE`
        TMUX_NAME=`expr $TMUX_NAME + $RANDOM % 100`
    else
        TMUX_NAME=`expr $RANDOM % 1024`
    fi

    echo $TMUX_NAME > $SSH_UNIQUE_ID_FILE

    TMUX_NAME="id$TMUX_NAME"
fi

echo Connecting to tmux $TMUX_NAME on hostname $SSH_HOSTNAME

SLEEP=0
while true; do

    ssh $PORT -o TCPKeepAlive=no -o ServerAliveInterval=15 -Y -X -C -t -o BatchMode=yes $SSH_HOSTNAME "tmux attach-session -t $TMUX_NAME || tmux -2 -u new-session -s $TMUX_NAME"
    SLEEP=10
    if [ $SLEEP -gt 0 ]
    then
        echo Reconnecting to session $TMUX_NAME on hostname $SSH_HOSTNAME in $SLEEP seconds
        sleep $SLEEP
    fi
done

1

এটি হ'ল প্রকৃতপক্ষে একটি দুর্দান্ত ব্যবহারকারীর অভিজ্ঞতা তৈরি করে। আপনি যখনই টার্মিনালটি খোলেন তখন এটি স্বয়ংক্রিয়ভাবে tmux শুরু হয় (শারীরিক এবং ssh উভয়)। আপনি একটি ডিভাইসে আপনার কাজ শুরু করতে পারেন, টার্মিনাল থেকে প্রস্থান করতে পারেন এবং অন্য একটিতে আবার শুরু করতে পারেন। যদি এটি সেশনে ইতিমধ্যে সংযুক্ত কাউকে সনাক্ত করে তবে এটি নতুন সেশন তৈরি করবে। আপনার শেল বা উপর নির্ভর করে এটি সার্ভারে রাখুন ।~/.zshrc~/.bashrc

 if [[ -z "$TMUX" ]] ;then
     ID="$( tmux ls | grep -vm1 attached | cut -d: -f1 )" # get the id of a deattached session
     if [[ -z "$ID" ]] ;then # if not available attach to a new one
         tmux new-session
     else
         tmux attach-session -t "$ID" # if available attach to it
     fi
fi

0

আমি জানি আমি একটি পুরানো থ্রেডটি পুনরুদ্ধার করছি তবে আমি বাশরসি সলিউশনটিতে কিছু কাজ করেছি এবং আমার মনে হয় এর কিছুটা ব্যবহার রয়েছে:

#attach to the next available tmux session that's not currently occupied
if [[ -z "$TMUX" ]] && [ "SSH_CONNECTION" != "" ];
then
    for i in `seq 0 10`; do #max of 10 sessions - don't want an infinite loop until we know this works
            SESH=`tmux list-clients -t "$USER-$i-tmux" 2>/dev/null` #send errors to /dev/null - if the session doesn't exist it will throw an error, but we don't care
            if [ -z "$SESH" ] #if there's no clients currently connected to this session
            then
                tmux attach-session -t "$USER-$i-tmux" || tmux new-session -s "$USER-$i-tmux" #attach to it
                break #found one and using it, don't keep looping (this will actually run after tmux exits AFAICT)
            fi #otherwise, increment session counter and keep going
    done

fi

এখনকার জন্য 10 (11) সেশনে একটি ক্যাপ রয়েছে - আমি বাশার্কে অসীম লুপ দিয়ে আমার সার্ভারটি মারতে চাইনি। এটি বেশ নির্ভরযোগ্যভাবে কাজ করছে বলে মনে হচ্ছে, সেশনটি উপস্থিত না থাকলে তালিকা-ক্লায়েন্টদের টিএমউক্সের ব্যর্থতা ব্যতীত।


0

আপনার ssh সেশনটি ড্রপ হলে আপনার উপায় আপনাকে পুরানো tmux উদাহরণের সাথে পুনরায় সংযোগ করতে দেয়। execঅবশ্যই একটি কাঁটাচামচ সংরক্ষণ করে।

if [ -z "$TMUX"  ]; then
  pid=$(tmux ls | grep -vm1 "(attached)" | cut -d: -f1)
  if [ -z "$pid" ]; then
    tmux new -d -s $pid
  fi

  exec tmux attach -t $pid
fi
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.