连接到 SSH 后继续执行 shell 命令

Mar*_*arc 7 shell ssh

不确定我问的问题是否正确,但基本上我想自动化这个过程

  scp ~/.ssh/id_rsa.pub username@example.com:~/
  ssh username@example.com
  mkdir .ssh
  cat id_rsa.pub >> .ssh/authorized_keys
  rm id_rsa.pub
  chmod go-w ~
  chmod 700 ~/.ssh
  chmod 600 ~/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

所以我想我可以创建一个 shell 脚本并将它放在我的 .bash_profile 中,如下所示:function

setup_ssh () {
  scp ~/.ssh/id_rsa.pub $1:~/
  ssh $1
  #the following is happens when connected to the server using ssh
  mkdir .ssh
  cat id_rsa.pub >> .ssh/authorized_keys
  rm id_rsa.pub
  chmod go-w ~
  chmod 700 ~/.ssh
  chmod 600 ~/.ssh/authorized_keys
}
Run Code Online (Sandbox Code Playgroud)

但当然这不起作用,因为一旦连接到服务器,它就不会继续执行命令。一旦通过 ssh 连接到服务器,有没有办法继续执行命令?

phe*_*mer 9

这是一种稍微不同的工作方式:

setup_ssh() {
  cat ~/.ssh/id_rsa.pub | ssh $1 '
    mkdir .ssh;
    cat >> .ssh/authorized_keys;
    chmod go-w .;
    chmod 700 .ssh;
    chmod 600 .ssh/authorized_keys
  '
}
Run Code Online (Sandbox Code Playgroud)

你也可以去掉catid_rsa.pub 文件中的 shell 管道,但我认为这足以让你继续前进。

编辑:
它的工作方式
你基本上是在远程主机上启动一个新的 shell 来执行你传递给的命令ssh(在引号中)。当它到达cat >> .ssh/authorized_keys部件时,还没有从 STDIN 读取任何内容,因此来自 的数据cat ~/.ssh/id_rsa.pub仍然坐在那里。cat从 STDIN 读取数据,然后我们将其重定向到新的 authorized_keys 文件。然后我们执行剩下的命令。


for*_*sck 5

将您的身份添加到远程服务器,如果需要,还会创建具有适当权限的 ~/.ssh 树。

ssh-copy-id -i ~/.ssh/id_rsa.pub user@server
Run Code Online (Sandbox Code Playgroud)