Ssh,在登录时运行命令,然后保持登录状态?

jon*_*han 34 automation linux ssh command-line-interface

我用expect试过这个,但没有用:它最后关闭了连接。

我们可以通过 ssh 运行一个脚本来登录远程机器,运行命令,而不是断开连接吗?

所以在一台机器上ssh,cd到某某目录,然后运行一条命令,保持登录状态。

-乔纳森

(希望我用过)

#!/usr/bin/expect -f
set password [lrange $argv 0 0]
spawn ssh root@marlboro "cd /tmp; ls -altr | tail"
expect "?assword:*"
send -- "$password\r"
send -- "\r"
interact
Run Code Online (Sandbox Code Playgroud)

Bil*_*iss 28

; /bin/bash在远程端的命令行末尾添加一个?那是:

spawn ssh -t root@marlboro "cd /tmp; ls -altr | tail; /bin/bash -i"
Run Code Online (Sandbox Code Playgroud)

更好的是,将 root 的 .bashrc 更改为如下所示:

PROMPT_COMMAND="cd /tmp && ls -altr | tail ; unset PROMPT_COMMAND"
Run Code Online (Sandbox Code Playgroud)

:)

  • 尝试`ssh -t` 分配一个pty。 (8认同)
  • 您可能想在该 bash 中添加 `-i`。 (2认同)

小智 6

ssh 进入服务器、生成交互式 shell 并在该 shell 中运行命令的最简单和最干净的方法是为 bash 创建自定义 rc 文件。

在服务器上的自定义 bashrc 文件中,首先获取默认文件,然后添加自定义命令,例如

~/.bashrc_custom:

. ~/.bashrc
cd dir/
workon virtualenvproject
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样开始你的 SSH 会话:

$ ssh -t server "/bin/bash --rcfile ~/.bashrc_custom -i"
Run Code Online (Sandbox Code Playgroud)

-t选项强制进行伪 tty 分配,以便诸如制表符完成之类的工作。

--rcfile选项指定加载哪个 rcfile 而不是默认的。重要提示:您必须在命令行上的单字符选项之前放置“双破折号参数”才能被识别。

-i/bin/bash的参数用于调用交互式 shell。


Jed*_*els 5

如果您可以在 Python 中执行此操作,pexpect有一个示例几乎可以完全满足您的要求:

import pexpect
child = pexpect.spawn ('ftp ftp.openbsd.org')
child.expect ('Name .*: ')
child.sendline ('anonymous')
child.expect ('Password:')
child.sendline ('noah@example.com')
child.expect ('ftp> ')
child.sendline ('ls /pub/OpenBSD/')
child.expect ('ftp> ')
print child.before   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.
Run Code Online (Sandbox Code Playgroud)

要使用 ssh 而不是 ftp 来执行此操作,您需要类似于以下的代码(pexpect 中的示例文件有更多详细信息和信息,但以下是基础知识):

import pexpect
child = pexpect.spawn ('ssh root@marlboro')
child.expect ('Password:')
child.sendline ('password')
child.expect ('prompt# ')
child.sendline ('cd /tmp')
child.expect ('prompt# ')
child.sendline ('ls -altr | tail')
child.expect ('prompt# ')
print child.before, child.after   # Print the result of the ls command.
child.interact()     # Give control of the child to the user.
Run Code Online (Sandbox Code Playgroud)

不要误会我的意思,我喜欢expect(尤其是autoexpect),但是Python对我来说太容易理解了。