请教一个shell脚本的编写

lovesql114 2007-11-12 08:07:15
请问下面这一系列操作能不能用一个shell脚本来实现:
telnet连接一台主机;
输入用户名、密码;
连接上主机后进入某个目录;
在该目录下新建个目录。

telnet命令和身份验证是在一个终端进程,创建目录是在另个进程了吧?
请问怎样用一个shell脚本来实现。

先谢谢大家~~~
...全文
353 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengdkm 2007-11-13
  • 打赏
  • 举报
回复
刚才突然想到,对第二个问题,我没太明白你的意思,说下我的理解。如果把当前终端的shell看作父:
1.在终端执行一个sh脚本,是先fork,然后exec一个shell,用来执行这个脚本。
父->shell
2.在终端用source命令执行sh脚本(或者是用.执行脚本),表示在当前shell执行。没有子shell

3.在终端执行一个程序,比如telnet,是先fork,然后exec执行这个程序。
父->telnet

4.如果在一个sh脚本里,包含telnet命令,那么就是上面的两个结合:
先fork,exec一个shell,执行相关内部命令,遇到外部命令,比如telnet时,就再fork,exec执行这个外部程序。
父->shell->telnet

不知道你说的“父进程和子进程的命令可以由一个脚本来实现”中的父子,是不是指上面4中的“shell->telnet”这两个?如果是,那么“最典型的是ftp自动登录的脚本”就是指这个。

如果是指上面的2中的情况,那就用.执行。
fengdkm 2007-11-13
  • 打赏
  • 举报
回复
1、你搜下,看能找到不能,我找到两个:
http://www.linuxsir.org/bbs/archive/index.php/t-55913.html
里面讲到了两种方法。不过我验证。你可以分别试下。


http://unix-cd.com/unixcd12/article_775.html
里面有个相对完整的脚本。


2、可以在一个脚本实现,不过子进程的命令,都要想办法传进去,要么用匿名管道传递进去,要么用expect。
最典型的是ftp自动登录的脚本。




lovesql114 2007-11-13
  • 打赏
  • 举报
回复
谢谢fengdkm
expect是要安装的吧?
因为我这一系列操作是想封装成一个脚本由一个Java程序调用的,不能保证每个客户端都有expect。
另外我是想知道终端下很多命令都会启动进入一个子进程,如比telnet,minicom,tftp等,父进程和子进程的命令可以由一个脚本来实现吗?
sqllong 2007-11-13
  • 打赏
  • 举报
回复
小牛牛;
lovesql114 2007-11-13
  • 打赏
  • 举报
回复
非常谢谢大家的回复.

expect是个好方法,但是因为我不能保证每个客户端上都有expect,所以还是想用一般的shell脚本来实现.

回5楼fengdkm:
我是这样想的:
打开一个终端,在里面输入cd , ls这些命令,控制权都还在这个终端里,定义它为父shell;
然后比如输入tftp 192.168.1.2这个命令,当前终端会显示tftp>
这时再输入cd,ls这些命令就没用了,我觉得现在已经是进入tftp这个子shell了,可以在tftp>提示符后输入get filename命令下载文件
然后要输入quit命令,控制权才回到父shell.

操作大概显示如下:
[root@RTOS root]#cd /home/lxy
[root@RROS lxy]#tftp 192.168.1.2
tftp> get download_file
tftp> quit
[root@RTOS lxy]#ls download_file

我觉得cd,tftp,ls这三个命令是父进程,get,quit这两个命令是子进程.

另外我本来也要写个脚本就是实现上面这一系列操作,一直没搞明白怎么把那五个命令弄到一起,模仿zhiqiu的那个脚本这样写:
#!/bin/sh
cd /home/lxy
tftp 192.168.1.2 << EOF
get download_file
quit
EOF
ls
就OK了

非常感谢zhiqiu
human3000 2007-11-13
  • 打赏
  • 举报
回复
参考我这个吧,这是个expect的shell程序...
#!/usr/bin/expect --
set timeout 60
spawn /usr/bin/telnet 1.1.1.2
expect "login:"
send "abc\r"
expect "Password:"
send "1111\r"
expect "abc"
send "su\r"
expect "Password:"
send "1111\r"
interact
  • 打赏
  • 举报
回复
expect就可以实现的.
或者用类似的方法实现

#!/bin/sh

ftp -i -v -n ftp.example.com <<EOF
user anonymous
cd pub
put upload_file
bye
EOF
fengdkm 2007-11-12
  • 打赏
  • 举报
回复
就是一个自动登录脚本,有个程序是“专门”做这个的:expect。
我没telnet环境,写了个ssh的。你自己模仿看看吧,很简单的,我也是昨天刚接触expect。


新建个文件比如testssh.sh,内容如下:
#!/usr/bin/expect
spawn ssh linkage@主机地址
expect "password:"
send "帐号的密码\r"
expect "]$"
send "cd 需要进的目录 && mkdir 新建的目录名\r"
expect "]$"
close

wuyuanzhe 2007-11-12
  • 打赏
  • 举报
回复
才疏学浅,确实没见过用一个脚本实现的

不过用两个脚本或者用ant脚本倒是可以很容易实现

23,116

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧