分析一下这个简单shell (“自动”telnet)

分析一下这个简单shell (“自动”telnet)

自动输入用户名和密码用于tenlnet的shell,我觉得:
telnet $ip <&8 >&7 &    这行好像有问题!帮忙分析一下,我在rh9运行错误。


#===========autotelnet.sh==============
#!/bin/bash
if (( $# != 1 ))
then
  echo " usage: $0 address "
  exit 1
fi
ip=$1
inp1=`cat param |awk '{ print $1 }'`#param为包含ip,username,passwd参数文件
inp2=`cat param |awk '{ print $2 }'`
inp3=`cat param |awk '{ print $3 }'`

inputfile=in
outputfile=out
rm -fr $inputfile
rm -fr $outputfile
mknod $inputfile p
touch $outputfile

#file description 7 for out and 8 for in
exec 7<>$outputfile
exec 8<>$inputfile

telnet $ip <&8 >&7 &   
#注意上面一行

sleep 1; echo $inp1 >> $inputfile
sleep 1; echo $inp2 >> $inputfile
sleep 1; echo $inp3 >> $inputfile

tail -f $outputfile &

while true
do
  read str
  if [[ $str = "quit" || $str = "exit" ]]
  then echo $str >> $inputfile ; exit
  else echo $str >> $inputfile
  fi
done
#==================================


参数文件, 输入在出现正常提示符之前需要输入的所有内容, 用空格分开, 以ip地址或者hostname开头
#=====param============
localhost root password

#=====================      
不错. 简单修改一下:
复制内容到剪贴板
代码:
[color=blue]-(guest@mac:tty1)-(tmp)-
[25750 0] %[/color] cat telnet.sh
#!/bin/bash

if (( $# != 3 )); then
    echo "usage: $0 host user passwd"
    exit 1
fi

host=$1
user=$2
passwd=$3

inputfile=in
outputfile=out
rm -rf $inputfile
rm -rf $outputfile
mknod $inputfile p
touch $outputfile

exec 7<> $outputfile
exec 8<> $inputfile

telnet $host <&8 >&7 &

sleep 1
echo $user >> $inputfile
sleep 1
echo $passwd >> $inputfile

tail -f $outputfile &

while true; do
    read str
    if [[ $str = "quit" || $str = "exit" ]]
    then
        echo exit >> $inputfile
        sleep 1
        exit
    else
        echo $str >> $inputfile
    fi
done
[color=blue]-(guest@mac:tty1)-(tmp)-
[25750 0] %[/color] ./telnet.sh
usage: ./telnet.sh host user passwd
[color=blue]-(guest@mac:tty1)-(tmp)-
[25750 1] %[/color] ./telnet.sh localhost foo foo
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

Linux 2.6.11-gentoo-r9 (localhost) (9)


tux login: foo
Password:
Last login: Wed Jun 22 22:51:08 from localhost
foo@tux foo $ pwd
pwd
/home/foo
foo@tux foo $ ls /
ls /
bin   dev  gentoo  lib         mnt  proc  sbin  tmp  var
boot  etc  home    lost+found  opt  root  sys   usr
foo@tux foo $ bye
bye
-bash: bye: command not found
foo@tux foo $ quit
Connection closed by foreign host.
exit
logout
[color=blue]-(guest@mac:tty1)-(tmp)-
[25750 0] %[/color]
      
能不能用于ssh自动登录么?
我改了一下,好象不行哦。
ssh [email="$2@$1"]$2@$1[/email]

:-(      
ssh 可能跟 telnet 的机制不同
比较通用的方法是用 expect      
能告诉我怎么使用expect自动登录ssh么?;)谢谢了      
建议先看看 expect 的文档      
请问高手,有几处看不明白:
1、为什么用mknod $input,而不用touch呢?
2、exec 7<> $input,该语句执行后,新建一个子shell,在子shell中执行完毕后,是否能返回原脚本中?      
1)touch 只能创建普通文件,像管道、字符设备、块设备等特殊文件就要用 mknod 了。详细信息可以参考 mknod 的 man page

2)exec 7<>$input 没有启动 sub shell,仅做 redirection:
复制内容到剪贴板
代码:
       exec [-cl] [-a name] [command [arguments]]
              If  command is specified, it replaces the shell.  No new process
              is created.  The arguments become the arguments to command.   If
              the -l option is supplied, the shell places a dash at the begin-
              ning of the zeroth arg passed to command.  This is what login(1)
              does.  The -c option causes command to be executed with an empty
              environment.  If -a is supplied, the shell passes  name  as  the
              zeroth  argument  to the executed command.  If command cannot be
              executed for some reason, a non-interactive shell exits,  unless
              the  shell  option execfail is enabled, in which case it returns
              failure.  An interactive shell returns failure if the file  can-
              not  be executed.  [color=red]If command is not specified, any redirections
              take effect in the current shell[/color], and the return  status  is  0.
              If there is a redirection error, the return status is 1.
      
确实是这样,我学的太粗糙了!      
革命尚未成功,同志仍需努力