กำลังโหลด aliases เชลล์โลคัลไปยังเซสชัน ssh dynamicaly


24

เมื่อฉันเข้าสู่เครื่องโดยใช้sshฉันต้องการให้นามแฝงและฟังก์ชั่นของฉันอยู่ที่นั่น พูดอีกอย่างคือเข้าสู่เครื่องบางอย่างที่ฉันต้องการฉันสามารถใช้ทางลัดคำสั่งของฉัน

ฉันต้องการมันเป็นแบบไดนามิกทุกครั้งที่ฉันเข้าสู่ระบบฉันหวังว่าฉันจะได้รับการปรับปรุงนามแฝง

หมายเหตุ: บ่อยครั้งที่มันเป็นครั้งแรกที่เข้าสู่ระบบโดยไม่ทราบว่าเครื่องและไฟล์ที่นั่น บางครั้งมันเป็นการเข้าสู่ระบบเดียวเพียงครั้งเดียวสำหรับเครื่องนั้น จะต้องมีการทำความสะอาดหลังจากนั้นการกำหนดค่าก่อนหน้านี้จะต้องถูกเรียกคืนด้วย

คำตอบ:


18

คุณสามารถคัดลอกชั่วคราว.bashrcไปยังเครื่องระยะไกลของคุณด้วยชื่ออื่น ตัวอย่างเช่นการใช้.bashrc_temp:

user@local$ scp .bashrc user@remote:~/.bashrc_temp

หลังจากนั้นคุณสามารถเข้าสู่เครื่องระยะไกล:

user@local$ ssh user@remote

และsourceไฟล์.bashrc_temp:

user@remote$ source ~/.bashrc_temp

ตอนนี้คุณสามารถใช้งาน.bashrcและฟังก์ชั่นของคุณได้แล้ว เมื่อคุณทำงานเสร็จแล้วคุณสามารถลบไฟล์ ~ / .bashrc_temp บนเครื่องระยะไกลและออกจากระบบ

การคัดลอกไฟล์และการล็อกอินไปยังเครื่องระยะไกลอาจทำได้ด้วยฟังก์ชั่นทุบตี:

# copy the .bashrc to the remote machine 
# and log into the remote machine.
# parameter $1: user@remote
function s() {
  scp ~/.bashrc $1:~/.bashrc_temp
  ssh $1
}

อัปเดต :

คุณอาจพิจารณาที่จะคัดลอก.bashrcไปยัง/tmpบนเครื่องระยะไกลและแหล่งที่มาของ/tmp/.bashrc_tempคุณ

อัปเดต 2 :

คุณสามารถเข้าสู่เครื่องระยะไกลโดยใช้t-SSH .bashrcนี้จะใช้อุณหภูมิของคุณ ฟังก์ชั่นการปรับปรุงs():

function s() {
  scp ~/.bashrc $1:/tmp/.bashrc_temp
  ssh -t $1 "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

นี่คือสิ่งที่ฉันกำลังมองหา ขอบคุณ! แต่มันเป็นไปได้ไหมที่จะใช้งานได้มากกว่านี้? ในขั้นตอนเดียว? เพราะตอนนี้เราต้องการ 3 ขั้นตอน: เข้าสู่ระบบลบก่อนออกจากระบบ

ตกลงฉันเห็นตอนนี้หลังจากการอัปเดตของคุณ ยิ่งใหญ่ อีกหนึ่งการแก้ไข: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

ฉันได้เพิ่มการแก้ไขของคุณในการปรับปรุงของฉัน 2 ขอบคุณ

5
คำตอบเกือบทั้งหมด (รวมถึงอันนี้) ใช้ชื่อไฟล์ที่คาดเดา/tmp/ได้ สิ่งนี้อาจถูกนำไปใช้ประโยชน์โดยผู้ใช้รายอื่น ๆ เพื่อเรียกใช้รหัสใด ๆ ในฐานะผู้ใช้ที่ลงชื่อเข้าใช้สิ่งนี้ควรใช้mktempเพื่อให้แน่ใจว่าไฟล์ชั่วคราวมีชื่อเฉพาะ
Tometzky

9

jens-na ให้คำตอบที่ยอดเยี่ยม ฉันใช้เวลาสักครู่และทำงานซ้ำอีกเล็กน้อยเพื่อให้ทำงานได้ดีขึ้น ด้วยวิธีนี้คุณสามารถส่งผ่านพารามิเตอร์ใด ๆ ไปยัง SSH เช่นหมายเลขพอร์ต ความแตกต่างคือมันใช้sshคำสั่งในการอัปโหลด.bashrcไฟล์แทนscpซึ่งจะใช้ชื่อพารามิเตอร์คำสั่งที่แตกต่างกัน

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

sshs() {
        ssh $@ "cat > /tmp/.bashrc_temp" < ~/.bashrc_remote
        ssh -t $@ "bash --rcfile /tmp/.bashrc_temp ; rm /tmp/.bashrc_temp"
}

เรียกใช้ดังนี้:

sshs user@server

ชื่อ ' sshs' ใช้สำหรับ "แหล่งข้อมูล SSH" ใช้sshเมื่อคุณไม่ต้องการแหล่งที่มาและใช้sshsเมื่อคุณทำ

https://gist.github.com/jonahbron/5549848


นั่นมีประโยชน์ ชุดของพารามิเตอร์เดียวกันไม่จำเป็นต้องเพิ่มรายการใน ~ / .ssh / config เพียงเพื่อระบุพอร์ตอื่น!
Tomek Wyderka

เนื่องจากเป็นชื่อคำสั่งเดียวกันอาจเป็นไปได้ในการเรียกใช้ครั้งเดียวและพิมพ์รหัสผ่านเพียงครั้งเดียว ... แต่น่าเสียดายที่การรวมคำสั่งของคุณลงในรายงานเดียว:Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka ใช่ฉันพยายามประมาณ 20 นาทีเพื่อให้มันเป็นคำสั่งเดียว แต่ไม่พบวิธี อาจเป็นคนที่ฉลาดกว่าที่ฉันคิดได้ แต่ก็ไม่เป็นไปได้
Jonah

2
ฉันได้รับคำตอบนี้และได้ทำซ้ำในสองสามสัปดาห์ ผลที่ได้คือเครื่องมือเป่าเต็มรูปแบบที่ทับปัญหา: github.com/Russell91/sshrc
RussellStewart

1
@Jonah คุณช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไมคุณถึงใช้ $ {*: 1} แทนที่จะเป็น $ @
RussellStewart

8

ฉันคิดว่า sshrc คือสิ่งที่คุณกำลังมองหา: https://github.com/Russell91/sshrc

sshrc ทำงานเหมือนกับ ssh แต่ก็ยังแหล่ง ~ / .sshrc หลังจากเข้าสู่ระบบจากระยะไกล

$ echo "echo welcome" > ~/.sshrc
$ sshrc me@myserver
welcome

$ echo "alias ..='cd ..'" > ~/.sshrc
$ sshrc me@myserver
$ type ..
.. is aliased to `cd ..'

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


ดี ฉันชอบแฮ็ค xxd!
Tomek Wyderka

@Tomek - ใช่แล้วการแฮ็ก xxd นั้นยอดเยี่ยมมาก ฉันพยายามทำให้งานสำเร็จลงด้วย scp จากนั้นด้วยการ piping เป็น ssh ไม่สามารถทำได้หากไม่มีการโทร 2 ครั้งไปยังเซิร์ฟเวอร์ - รหัสผ่าน 2 รายการ - การเดินทางไปกลับ 2 ครั้ง มันเป็นที่ยอมรับไม่ได้ ดังนั้นฉันคิดไม่ถึง
RussellStewart

ฉันมีข้อบกพร่อง sshrc แฮงค์โดยไม่มีการตอบสนอง คุณสามารถใส่รหัสการแก้ปัญหา (สามารถอยู่ในความคิดเห็น) ลงใน sshrc เพื่อให้ฉันสามารถติดตามได้
Tomek Wyderka

น่าสนใจ มันเป็นเพียงสคริปต์ทุบตีดังนั้นโดยปกติข้อผิดพลาดหรือคำเตือนที่ส่งออกไปจะถูกพิมพ์ลงบนหน้าจอโดยอัตโนมัติ มีกี่ไบต์ใน. sshrc.d ของคุณ นอกจากนี้ให้พิมพ์vim $(which sshrc)และคุณจะเห็นไฟล์ bash คุณสามารถเพิ่มคำสั่ง echo หลังแต่ละบรรทัดเพื่อดูว่ามันค้างที่ไหน
RussellStewart

5

ไม่แน่ใจเกี่ยวกับข้อ จำกัด แต่ฉันสามารถทำให้สิ่งนี้ทำงานได้:

function ssh_with_rc() {
   RC_DATA=`cat ${HOME}/.bashrc | base64 -w 0`
   ssh -t $@ "echo \"${RC_DATA}\" | base64 --decode > /tmp/${USER}_bashrc; bash --rcfile /tmp/${USER}_bashrc; rm /tmp/${USER}_bashrc"
}

alias ssh="ssh_with_rc"

นี่คือคำตอบที่ดีที่สุดสำหรับฉันเพราะมันเป็นคำสั่ง ssh เดียวไม่มีสิ่ง scp การปรับปรุงที่เหลือเพียงอย่างเดียวสำหรับฉันคือการหาวิธีหลีกเลี่ยงRC_DATAตัวแปร
Sridhar Sarnobat

2

นี่คือสิ่งที่ฉันมาด้วย จะช่วยให้คุณรักษาไฟล์ rc ปกติ แต่ยังทำทุกอย่างในการเชื่อมต่อหนึ่ง ssh (เช่นจะต้องเข้าสู่ระบบเพียงครั้งเดียวเมื่อเทียบกับการทำ scp ก่อน)

#copies some environment over to the remote machine
function ssh() {
  /usr/bin/ssh -t $* "echo `base64 -i ~/bin/remote_ssh_env.sh` | base64 --decode > /tmp/remote_ssh_env.sh; bash --rcfile /tmp/remote_ssh_env.sh"
}

ฉันไม่แน่ใจว่าไฟล์ rc นั้นมีขนาดใหญ่เพียงใดเนื่องจากอาจมีบางจุดสูงสุด


ฉันต้องตัดส่วนหนึ่งของคำสั่งด้วยเครื่องหมายคำพูดเดี่ยวเพื่อให้การทำงานถูกต้อง echo '`base64 .... sh`' - หลังจากนั้นมันก็ทำงานได้อย่างสวยงาม ขอบคุณ !!
K Robinson

หากขนาดกลายเป็นปัญหาคุณสามารถไพพ์เนื้อหาของไฟล์ผ่านยูทิลิตี้การบีบอัดเช่น gzip ก่อนการเข้ารหัส base64
K Robinson

2

ฉันคิดว่าhttps://github.com/fsquillace/pearl-sshทำสิ่งที่คุณต้องการ

ฉันเขียนมานานแล้วก่อนที่จะเกิด sshrc และมีประโยชน์มากกว่าเมื่อเทียบกับ sshrc:

  • ไม่ต้องการการพึ่งพา xxd สำหรับโฮสต์ทั้งสอง (ซึ่งไม่สามารถใช้งานได้บนโฮสต์ระยะไกล)
  • Pearl-ssh ใช้อัลกอริทึมการเข้ารหัสที่มีประสิทธิภาพมากขึ้น
  • มันเป็นรหัส ~ 20 บรรทัด (เข้าใจง่ายจริงๆ!)

ตัวอย่างเช่น

$> echo "alias q=exit" > ~/.config/pearl/sshrc
$> ssh_pearl myuser@myserver.com
myserver.com $> q
exit

1

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

$ mybash=`cat mybash`
$ ssh -t 127.0.0.1 "echo $mybash > /tmp/mybash; bash --rcfile /tmp/mybash ; rm /tmp/mybash"

ดูเหมือนว่าจะทำงานให้ฉัน


1

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

ปัญหาของฉันคือเมื่อฉันต้องการฉันเก็บสีนามแฝงฟังก์ชันและสคริปต์ของฉันในขณะที่ทำงานจากระยะไกล

http://fuse.sourceforge.net/sshfs.html


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