我正在寻找一种方法来自动定义我的会话中的任何服务器我ssh到的一些别名。 我不能把它们放在服务器上的.bashrc
文件中,因为我login的用户帐户被其他人共享,除此之外还有几十个,在每台机器上维护一个脚本将是痛苦的。 我知道我可以使用expect
自动input别名,但我只是想知道OpenSSH是否有内置的,可以用来实现这个?
期待这样做没有任何问题。 我做的另一种方式也很肮脏,用脚本,首先scp你想运行的configuration文件,然后ssh,运行它,保持连接。
因此,将所有configuration文件设置放在本地文件.<local username>-<hostname>-init.sh
,然后运行以下脚本以login到远程主机。
#!/bin/sh [ $# -eq 0 ] && { echo "syntax: $0 <host> [<ssh-option>...]" 1>&2 ; exit 1 ; } host=$1 ; shift # use any remaining args as ssh options initfile=".$USER-`hostname`-init.sh" scp -q ~/.ssh-init.sh "$host:/var/tmp/$initfile" ssh -t "$@" $host "bash --rcfile /var/tmp/$initfile"
你可以把你的configuration放在.bashrc
,只有在login时才让它们执行。为了使这个成为可能,你可以通过ssh传递一个环境variables。
.bashrc
修改
# common stuff if [ -n "$IAMTHEGREATEST" ]; then # my personal cool stuff fi; # other global stuff
sshd_config
修改:
AcceptEnv ... IAMTHEGREATEST
.ssh/config
修改(客户端):
Host ... SendEnv IAMTHEGREATEST
.bashrc
修改(客户端):
alias ssh='IAMTHEGREATEST="forsure" ssh'
(未经testing,但应该这样做)
从ssh(1)手册页,如果你创build了一个文件〜/ .ssh / rc ,它将在用户的loginshell被执行之前执行,从而在login之前有机会做“预先设置”任务。给出的例子是在login之前安装networking共享。
如果你不想使用单独的〜/ .ssh / rc文件,你可以使用/ etc / ssh / sshrc 。 检查您的特定用户名或一些识别方法的快速testing可能会限制其他人甚至不知道这是到位的。
如果〜/ .ssh / rc不存在,那么/ etc / ssh / sshrc是唯一的来源,所以你可以有效地实现两层的复杂性。
别名是由shell定义和解释的。
不幸的是, ssh
没有办法将它们传递给远程shell。
你可以在客户端编写一个ssh
包装器,在远程端设置一个很好的环境,但是它不会很漂亮。
如果可能的话,我将存储一个小脚本,用于在任何地方都可以访问的服务器上初始化/定义所需的所有内容,并在每个服务器上login后执行它。
一个可能的解决scheme是把你的脚本放在一个所有其他服务器可以访问的web服务器上。
然后,每个服务器应该只需要一个小脚本来执行如下操作:
wget http://myserver.com/myawesomescript.sh chmod +x myawesomescript.sh ./myawesomescript.sh
这样你只需要在一个地方更新它。
看看.ssh / config
这里是一个例子https://lookherefirst.wordpress.com/2007/12/17/a-simple-ssh-config-file/