#command -v <the_command> 检测命令是否存在返回命令所在路径,等价于which #if [ -x file ] 如果文件存在且可执行 if ! [ -x "$(command -v sshpass)" ]; then sudo apt-get install sshpass fi
port=20005 #echo -e 会进行转义 echo -e "\n请输入用户名!\n" #read-将交互输入保存在变量中 read name # 获得当前脚本的工作路径 dir=$(cd $(dirname $0);pwd) # 分割->获得文件名 file_name="${dir##*/}" # 传输文件 echo -e "\n[开始传输文件]\n" sshpass -p "$key" scp -r -P $port $dir username@IP_address:/data/cluster/$name if [ $pool -eq 1 ]||[ $pool -eq 2 ]||[ $pool -eq 3 ] then # remotessh为标记符,下面的内容全部重定向到ssh连接的终端中, 一定要保证下面的全是以字符串的形式 # 由于shell会进行预转换,所以shell特殊的量需要额外注意,否则结果将只会是当前主机的。因此需要加\ # man sshpass中提示:多个-t选项强制分配tty,即使ssh没有本地tty,所以使用-tt参数来强制伪终端分配(表示为这个连接分配TTY),即使标准输入不是终端,否则退出后会提示`Pseudo-terminal will not be allocated because stdin is not a terminal的错`。 即指明是来自脚本的调用 # 控制终端(/dev/tty)就是当前进程的控制终端的设备特殊文件,可以进行写入写出 sshpass -p "$key" ssh -tt -p $(($port+$pool)) username@IP_address << remotessh Condor_number=\`condor_q | grep jobs | awk '{print \$1}'\` if [ \$Condor_number -le 1 ] then echo -e "\n创建任务失败!\n" else echo -e "\n创建任务成功!\n" fi exit remotessh else echo -e "没有该资源池\n" exit fi
man sshpass中关于-t参数的说明
Force pseudo-terminal allocation. This can be used to execute arbitrary screen-based programs on a remote machine, which can be very useful, e.g. when implementing menu services. Multiple -t options force tty allocation, even if ssh has no local tty.