tải bí danh shell cục bộ để ssh phiên động


21

Khi tôi đăng nhập vào một số máy bằng ssh Tôi ước bí danh chức năng ở đó Nói cách khác, đăng nhập vào một số máy tôi muốn tôi có thể sử dụng các phím tắt lệnh của mình.

Tôi cần nó năng động, mỗi khi tôi đăng nhập, tôi ước mình đã cập nhật bí danh.

Ghi chú:   Rất thường là lần đầu tiên đăng nhập, mà không biết máy và tệp ở đó.   Đôi khi nó là một lần đăng nhập. Chỉ một lần cho máy đó. Nó cần phải được làm sạch sau đó, cấu hình trước đó cũng phải được khôi phục.

Câu trả lời:


17

Bạn có thể tạm thời sao chép .bashrc để máy từ xa của bạn với một tên khác. Ví dụ: sử dụng .bashrc_temp:

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

Sau đó, bạn có thể đăng nhập vào máy từ xa:

user@local$ ssh user@remote

source tập tin .bashrc_temp:

user@remote$ source ~/.bashrc_temp

Bây giờ bạn có thể sử dụng của bạn .bashrc và các chức năng của bạn. Khi bạn hoàn thành công việc của mình, bạn có thể xóa tệp ~ / .bashrc_temp trên máy từ xa và đăng xuất.

Việc sao chép tệp và đăng nhập vào máy từ xa có thể đạt được bằng chức năng bash:

# 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
}

Cập nhật :

Bạn cũng có thể xem xét để sao chép .bashrc đến /tmp trên máy và nguồn từ xa của bạn /tmp/.bashrc_temp.

Cập nhật 2 :

Bạn có thể đăng nhập vào máy từ xa bằng cách sử dụng ssh -t . Điều này sẽ tự động sử dụng tạm thời của bạn .bashrc. Cập nhật chức năng s():

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

Đây chắc chắn là những gì tôi đang tìm kiếm. Cảm ơn! Nhưng nó có thể làm nó nhiều chức năng hơn? Trong một bước? Bởi vì bây giờ chúng tôi cần 3 bước: đăng nhập, nguồn, xóa trước khi đăng xuất.

OK, tôi thấy bây giờ sau khi cập nhật của bạn. Tuyệt quá. Thêm một sửa chữa: "bash --rcfile /tmp/.bashrc_temp; rm /tmp/.bashrc_temp"

Tôi đã thêm bản sửa lỗi của bạn vào bản cập nhật của tôi 2. Cảm ơn.

5
Hầu như tất cả các câu trả lời (bao gồm cả câu trả lời này) đều sử dụng tên tệp dự đoán trong /tmp/. Điều này có thể bị khai thác một cách tầm thường bởi bất kỳ người dùng nào khác để chạy bất kỳ mã nào với tư cách là người dùng đăng nhập. Điều này nên sử dụng mktemp để đảm bảo tệp tạm thời có một tên duy nhất.
Tometzky

9

jens-na cung cấp một câu trả lời tuyệt vời. Tôi đã dành một chút thời gian và làm việc lại một chút để làm việc tốt hơn một chút. Bằng cách này, bạn có thể chuyển bất kỳ tham số nào sang SSH, chẳng hạn như số cổng. Sự khác biệt là nó sử dụng ssh lệnh để tải lên .bashrc tập tin, thay vì scp, trong đó sử dụng các tên tham số lệnh khác nhau.

Bạn cũng sẽ nhận thấy rằng nó tải lên một tệp khác, .bashrc_remote, để bạn có thể chọn chính xác những gì bạn muốn nguồn trên các máy chủ từ xa, thay vì mọi thứ

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

Chạy nó như sau:

sshs user@server

Tên ' sshs 'Dành cho "Nguồn SSH". Sử dụng ssh khi bạn không muốn tìm nguồn và sử dụng sshs khi bạn làm

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


Điều đó hữu ích. Cùng một bộ tham số, không cần thêm mục vào ~ / .ssh / config chỉ để xác định cổng khác!
Tomek Wyderka

Vì nó là cùng một tên lệnh, có thể có thể thực hiện nó trong một lần chạy và chỉ nhập mật khẩu một lần ... Thật không may khi nối các lệnh của bạn vào một báo cáo: Pseudo-terminal will not be allocated because stdin is not a terminal
Tomek Wyderka

@TomekWyderka Vâng, tôi đã cố gắng khoảng 20 phút để chuyển nó xuống một lệnh, nhưng không tìm được cách nào. Có lẽ một người hiểu biết về BASH hơn tôi có thể hiểu, nhưng dường như điều đó là không thể.
Jonah

2
Tôi đã thực hiện câu trả lời này và lặp đi lặp lại trong vài tuần. Kết quả là một công cụ đầy đủ giúp phá vỡ vấn đề: github.com/Russell91/sshrc
RussellStewart

1
@Jonah bạn có thể giải thích cho tôi tại sao bạn sử dụng $ {*: 1} thay vì $ @.
RussellStewart

7

Tôi nghĩ sshrc là thứ bạn đang tìm kiếm: https://github.com/Russell91/sshrc

sshrc hoạt động giống như ssh, nhưng nó cũng nguồn ~ / .sshrc sau khi đăng nhập từ xa.

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

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

Bạn có thể sử dụng điều này để đặt các biến môi trường, xác định hàm và chạy các lệnh sau đăng nhập. Điều đó thật đơn giản và nó sẽ không ảnh hưởng đến những người dùng khác trên máy chủ - ngay cả khi họ cũng sử dụng sshrc. Để cấu hình nâng cao hơn, tiếp tục đọc.


Tốt đẹp. Tôi thích hack xxd!
Tomek Wyderka

@Tomek - yea hack xxd là hoàn toàn tuyệt vời. Tôi thực sự đã cố gắng để hoàn thành công việc với scp. Sau đó với đường ống vào ssh. Không thể thực hiện được nếu không có 2 cuộc gọi đến máy chủ - 2 mục nhập mật khẩu - 2 chuyến khứ hồi. Đó là điều không thể chấp nhận được. Vì vậy, tôi đã làm những điều không tưởng
RussellStewart

Tôi có một lỗi. sshrc bị treo mà không có phản hồi. Bạn có thể đặt một số mã gỡ lỗi (có thể trong các bình luận) vào sshrc để tôi có thể theo dõi nó không.
Tomek Wyderka

Hấp dẫn. Đây chỉ là một tập lệnh bash nên thông thường mọi lỗi hoặc cảnh báo được ném sẽ được in ra màn hình một cách tự động. Có bao nhiêu byte trong .sshrc.d của bạn? Ngoài ra, chỉ cần gõ vim $(which sshrc) và bạn có thể xem tập tin bash. Bạn có thể thêm các lệnh echo sau mỗi dòng để xem nó treo ở đâu.
RussellStewart

5

Không chắc chắn về những hạn chế, nhưng tôi đã có thể khiến nó hoạt động với thứ gì đó như:

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"

Đây là câu trả lời tốt nhất cho tôi vì đó là một lệnh ssh duy nhất, không có nội dung scp. Cải tiến duy nhất còn lại đối với tôi là tìm cách tránh RC_DATA biến.
Sridhar-Sarnobat

2

Đây là những gì tôi đã đưa ra. Nó cho phép bạn duy trì một tệp RC bình thường, nhưng cũng thực hiện mọi thứ trong một kết nối ssh (tức là chỉ cần đăng nhập một lần thay vì thực hiện scp trước).

#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"
}

Tôi không chắc chắn rằng tập tin RC có thể lớn như thế nào, vì nó có thể tối đa hóa tại một số điểm.


Tôi đã phải bọc một phần của lệnh trong dấu ngoặc đơn để làm việc này đúng. echo '`base64 .... sh`' - sau đó, nó hoạt động rất tuyệt. Cảm ơn!!
K Robinson

Nếu kích thước trở thành vấn đề, bạn có thể dẫn nội dung tệp qua tiện ích nén như gzip trước khi mã hóa base64.
K Robinson

2

tôi nghĩ vậy https://github.com/fsquillace/pearl-ssh làm những gì bạn cần.

Tôi đã viết nó từ lâu trước khi sshrc ra đời và nó có nhiều lợi ích hơn so với sshrc:

  • Nó không yêu cầu phụ thuộc vào xxd cho cả hai máy chủ (có thể không có trên máy chủ từ xa)
  • Pearl-ssh sử dụng thuật toán mã hóa hiệu quả hơn
  • Nó chỉ là ~ 20 dòng mã (thực sự dễ hiểu!)

Ví dụ:

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

1

Một tùy chọn để làm cho nó hoạt động với một phiên SSH duy nhất là sử dụng một biến để lưu trữ tệp bash của bạn thay vì sao chép nó.

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

Dường như làm việc cho tôi.


1

Tôi đang tìm cách giải quyết một vấn đề như của bạn, và nhận ra điều tôi thực sự tìm kiếm là sshfs. Có lẽ bạn cũng có thể sử dụng nó?

Vấn đề của tôi là khi ssh'ing, tôi muốn giữ màu sắc, bí danh, chức năng và tập lệnh của mình trong khi làm việc từ xa.

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


Lol, điều này cũng không bao giờ xảy ra với tôi. Đó là một giải pháp khá sáng tạo.
Sridhar-Sarnobat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.