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)
:)
小智 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。
如果您可以在 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对我来说太容易理解了。
| 归档时间: |
|
| 查看次数: |
43131 次 |
| 最近记录: |