【shell】多行重定向与免交互expect与ssh、scp的结合使用

目录

一、多行重定向

举例1:使用read命令接收用户的输入值会有交互过程

 举例2:设置变量的值

举例3:创建用户密码 

举例4:使用多行重定向写入文件中(以repo文件举例)

举例5:变量设定

二、免交互expect

ssh连接免交互 

定义变量

​编辑 使用位置变量的方式

测试题:给3台主机都创建test用户,并生成密码


一、多行重定向

可以理解为这是标准输入的一种替代品,可以帮助脚本开发人员不必使用临时文件来构建输入信息,可以直接产生一个文件,输入文件信息,常与非交互程序和命令一起使用

语法格式

命令<<   标记

....

......

标记

注意事项:

1、表示可以使用任意的合法字符(通用的字符是EOF表示end of file)

2、结尾的标记是一定要顶格写,前面不能有任何字符(包括空格)

3、结尾的标记后面也不能有任何字符(包括空格)

4、开头标记前后空格会被省略掉

5、单引号变量双引号

举例1:使用read命令接收用户的输入值会有交互过程

[root@localhost test]#read i <<EOF
> 10
> EOF
[root@localhost test]#echo $i
10

 举例2:设置变量的值

举例3:创建用户密码 

举例4:使用多行重定向写入文件中(以repo文件举例)

[root@localhost cs]#cat repo.sh 
#!/bin/bash
cat > /cs/http.repo <<EOF
[http]
name=http
baseurl=http://192.168.20.8/
gpgcheck=0
EOF

举例5:变量设定

Here Document 也支持使用变量,如果标记之间有变量被使用,会先替换变量值。如 果想要将一些内容写入文件,除了常规的方法外,也可以使用 Here Document。如果写入 的内容中包含变量,在写入文件时要先将变量替换成实际值,在结合 cat 命令完成写入。

[root@localhost cs]#cat repo.sh 
#!/bin/bash
ip="192.168.20.8"
filename="http.repo"
cat > /cs/${filename} <<EOF
[http]
name=http
baseurl=http://${ip}/
gpgcheck=0
EOF
[root@localhost cs]#bash repo.sh 
[root@localhost cs]#ls
http.r
### 非交互式通过SSH运行Shell脚本 为了通过 SSH 以非交互方式运行 Shell 脚本并捕获其返回值或输出,可以采用以下方法: #### 方法一:使用 `ssh` 命令直接执行远程命令 可以通过 `ssh` 命令直接在远程服务器上执行 Shell 脚本并将输出重定向到本地。这种方式不需要登录到远程机器即可完成操作。 ```bash output=$(ssh user@remote_host 'bash -s' < local_script.sh) echo "$output" ``` 上述代码中,`local_script.sh` 是本地的 Shell 脚本文件,它会被传递给远程主机并通过 `bash -s` 执行[^2]。脚本的标准输出会存储在 `$output` 变量中以便后续处理。 #### 方法二:将脚本上传至远程服务器再执行 如果需要更复杂的逻辑或者希望保留脚本在远程服务器上的记录,则可以选择先将脚本上传到目标服务器后再执行。 1. 使用 `scp` 将脚本复制到远程服务器: ```bash scp local_script.sh user@remote_host:/path/to/destination/ ``` 2. 登录到远程服务器并赋予脚本可执行权限: ```bash ssh user@remote_host 'chmod +x /path/to/destination/local_script.sh' ``` 3. 远程执行脚本并捕获输出: ```bash output=$(ssh user@remote_host '/path/to/destination/local_script.sh') echo "$output" ``` 此过程确保了即使某些命令需要用户输入(如 `passwd`, `scp`),也可以利用工具如 `expect` 来自动化这些交互行为[^3]。 #### 方法三:结合 Expect 自动化交互流程 对于那些确实无法完全自动化的场景(比如密码验证),可以借助 `Expect` 工具来模拟用户的键盘输入动作。 下面是一个简单的例子展示如何用 `Expect` 处理带密码提示的情况: ```tcl #!/usr/bin/expect set timeout 20 spawn ssh user@remote_host "/path/to/script.sh" expect { "assword:" { send "your_password\r"; exp_continue } } interact ``` 这段脚本定义了一个期望模式匹配器 (`expect`) 和相应的响应策略 (`send`),从而实现了无干预下的身份认证[^1]^。 注意替换其中的用户名、主机地址以及实际路径等内容为自己环境中的真实数据。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维菜鸟XY

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值