shell打开wifi命令_远程执行命令的填坑记录

be8675f657439ba5cce585810a33962f.png

前言

本文主要记录 bash 四种模式的细节,以便于遇到问题时查阅。

远程执行出错了

最近使用 ansible 比较多,在某次使用 shell 模块远程执行命令的时候老是报 ‘command not found’

但是手动登录到远端机器执行命令是成功的,于是开始思考里面的细节。

特别感谢这篇博文


bash 的四种模式

遇到问题的时候就觉得应该是环境变量的关系。

因为使用的是 bash,那下面就来记录一下 bash 的细节。

1. interactive + login shell

第一种是交互式的登录 shell。

这里需要理解两个概念:interactive , login

login shell 指用户以非图形界面或者以 ssh 登录到机器上时获得的第一个 shell 。

  • 简单些说就是需要输入用户名和密码的 shell
  • 通常不管以何种方式登录机器后用户获得的第一个 shell 就是 login shell。

interactive shell 会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。

  • 一般来说只要是需要用户交互的,即一个命令一个命令输入的 shell 都是 interactive shell。
  • 如果无需用户交互,它便是 non-interactive shell。
  • 通常来说如bash script.sh此类执行脚本的命令就会启动一个 non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的 shell。

那么这个模式下最简单的两个例子就是:

  • 用户直接登录到机器获得的第一个 shell
  • 用户使用ssh user@remote获得的 shell

这种模式下,shell 首先加载/etc/profile,然后再尝试依次去加载下列三个配置文件之一,一旦找到其中一个便不再接着寻找:

  • ~/.bash_profile
  • ~/.bash_login
  • ~/.profile

2. non-interactive + login shell

第二种模式的 shell 为 non-interactive login shell,即非交互式的登录 shell,这种是不太常见的情况。

一种创建此 shell 的方法为:bash -l script.sh,-l 参数是将 shell 作为一个 login shell 启动,而执行脚本又使它为 non-interactive shell。

对于这种类型的 shell,配置文件的加载与第一种完全一样。

3. interactive + non-login shell

第三种模式为交互式的非登录 shell。

这种模式最常见的情况是在一个已有 shell 中运行 bash,此时会打开一个交互式的 shell,而因为不再需要登录,因此不是 login shell。

对于此种情况,启动 shell 时会去查找并加载 /etc/bash.bashrc~/.bashrc 文件。

bashrc vs profile

  • profile 类型文件,它是某个用户唯一的用来设置全局环境变量的地方 。
    因为用户可以有多个 shell 比如 bash, sh, zsh 等, 但像环境变量这种其实只需要在统一的一个地方初始化就可以了, 而这个地方就是 profile。
    所以启动一个 login shell 会加载此文件,后面由此 shell 中启动的新 shell 进程如 bash,sh,zsh 等都可以由 login shell 中 继承环境变量等配置
  • bashrc,其后缀 rc 的意思为 Run Commands,由名字可以推断出,此处存放 bash 需要运行的命令 。
    但注意,这些命令一般只用于交互式的 shell,通常在这里会设置交互所需要的所有信息,比如 bash 的补全、alias、颜色、提示符等等。

所以引入多种配置文件完全是为了更好的管理配置,每个文件各司其职,只做好自己的事情。

4. non-interactive + non-login shell

最后一种模式为非交互非登录的 shell,创建这种 shell 典型有两种方式:

  • bash script.sh
  • ssh user@remote command

这两种都是创建一个 shell,执行完脚本之后便退出,不再需要与用户交互。

对于这种模式而言,它会去寻找环境变量BASH_ENV,将变量的值作为文件名进行查找,如果找到便加载它。

典型模式总结

下面举一些例子:

  • 登录机器后的第一个 shell:login + interactive
  • 新启动一个 shell 进程,如运行 bash:non-login + interactive
  • 执行脚本,如bash script.sh:non-login + non-interactive
  • 运行头部有如#!/usr/bin/env bash的可执行文件,如./executable:non-login + non-interactive
  • 通过 ssh 登录到远程主机:login + interactive
  • 远程执行脚本,如ssh user@remote script.sh:non-login + non-interactive
  • 远程执行脚本,同时请求控制台,如ssh user@remote -t 'echo $PWD':non-login + interactive
  • 在图形化界面中打开 terminal:Linux 上 : non-login + interactive;Mac OS X 上 : login + interactive

有出路了

通过上面的总结,ansible 的 shell 模块远程执行命令应该就是属于 non-login + non-interactive。

对于这种模式,bash 会选择加载$BASH_ENV的值对应的文件。

但是,注意到命令里面的那个脚本的第一行#!/usr/bin/env sh,并不是 bash,而是 sh。

那么 bash 和 sh 有啥区别呢?

通过执行whereis命令查看发现,sh 只是 bash 的一个软链接。

再通过查看文档知道,当 bash 以 sh 命令启动时,bash 会尽可能的模仿 sh。

所以配置文件的加载变成了下面这样:

  • interactive + login : 读取 /etc/profile 和 ~/.profile
  • non-interactive + login : 同上
  • interactive + non-l gin : 读取 ENV 环境变量对应的文件
  • non-interactive + non-login : 不读取任何文件

所以如果是 sh 的话,不会加载任何环境变量,结果还是 command not found

最后的解决办法就是:

  • 第一步 设置$BASH_ENV/etc/profile
  • 第二步 将#!/usr/bin/env sh改成#!/usr/bin/env bash

参考

ssh连接远程主机执行脚本的环境变量问题​feihu.me
ab73a1f08a0b135c02e7ae87f7ac77ea.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/559504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nodejs express use 传值_再也不怕面试官问你express和koa的区别了

前言用了那么多年的express.js,终于有时间来深入学习express,然后顺便再和koa2的实现方式对比一下。老实说,还没看express.js源码之前,一直觉得express.js还是很不错的,无论从api设计,还是使用上都是可以的…

linux 内网共享文件夹_局域网中实现linux文件共享

局域网中实现linux与Windows文件共享文件共享是重要的网络需求,特别在企业环境中这种需求显得非常迫切。我们知道Windows主机间的文件共享非常简单,可以通过网上邻居实现。但是企业环境中主机的操作系统比较复杂,其中不乏Linux、Unix这样的系…

没有工作经验找it_校招和社招有什么区别?没有工作经验,如何找工作?

我们的招聘一般分为社招和校招。社招就是社会上招聘,绝大多数都要有相关的工作经验。而校招则是针对在校大学生的,所以应届毕业生的身份很重要,失去了这个身份,就要进入社招的渠道,面临的压力和要求都要高得多。那么&a…

华为鸿蒙系统支持什么手机_华为鸿蒙系统支持的手机型号_鸿蒙系统支持华为哪几款手机...

华为鸿蒙系统的上市相信很多花粉都会有点迫不及待的去更新这最新的系统了吧。但是新系统一般刚出来的时候都只会有部分的机型有更新的权限。下面小编就来为大家介绍一下华为鸿蒙系统支持华为那几款手机吧。1.华为鸿蒙系统支持哪些华为机型9月11日,华为正式公布了支持…

python输入个人所得税计算_个税起征点上调至5000,用Python算一算少交多少税

原标题:个税起征点上调至5000,用Python算一算少交多少税今天出了一个重磅消息,个税起征点从3500上调到5000啦! 广大IT农民工的生活压力又减轻了一些,有没有 晚上加一个鸡腿,要不要~ 开心归开心,…

java开发中推荐的防御sql注入方法_不推荐的防御sql注入方式

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"云数据库SQL Server,具有企业许可…

hive 行转列和列转行的方法_面试常考!SQL行转列和列转行

关注上方“数据挖掘工程师”,选择星标,关键时间,第一时间送达!行转列,列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 的运算符PIVOT来实现。用传统的…

.net core 装了没生效_王者荣耀:辅助装出现惊天bug?辅助光环对自己无效?

大家好,我是老刘备。今天说的这个bug我已经发现许久,从新版本以来就一直在出现,起初我以为是辅助装的光环改动了,但是最近和我的小伙伴开黑之后也遇到这个bug,才发现不是如此。本期我就来带大家一起看看。辅助光环技我…

python sns绘制回归线_Python数分实战:员工流失情况预测

在很久之前,我有写一个Excel数据分析的实战项目,不晓得大家还记不记得,感兴趣的童鞋可以回看:A九姑娘:Excel数分实战:员工流失率分析​zhuanlan.zhihu.com本次的项目数据依旧是这个,但是我们这次…

go var 一个整数_Go语言学习基础-值、变量、常量

Hello world第一个程序是打印经典的“hello world”信息。保存为hello-world.go文件,在命令行中使用go run命令运行程序。若要构建为二进制文件,则使用go build来实现,然后直接执行二进制文件。结果:$ go run hello-world.gohello…

python列表转换成数字_python 字母转成数字Python操作列表的常用方法总结

下面列出列表常用的方法操作列表以及小例子: 1. Append 在列表末尾添加元素,需在列表末尾添加元素,需要注意几个点: A. append中添加的参数是作为一个整体 >>> name list("scott") >>> name [s, c, o, t, t] &…

怎么取消自动格式化_iPhone自动扣费怎么取消?App Store、微信、支付宝关闭自动扣费教程...

经常有网友反馈,自己的手机每月会被不知不觉的被扣钱,但又不知道如何关闭,烦恼不已。其实,现在很多视频、音乐、购物等APP都有会员充值功能,其中不少还包含“自动续费”功能,一旦开启会员,今后就…

c# selenium chrome 文件下载_Selenium 框架原理以及环境安装

Selenium 框架原理图片来自转载 蓝色的图Selenium Language Binding就是我们平时使用的编码语言,包括java、python、C#等。可以看到这些语言并没有直接与Browser Drivers进行通信,而是通过了JSON WireProtocol,这就是webdriver协议 &#xff…

怎么打包图片_怎么将许多张照片打包发到邮箱?

怎么将许多张照片打包发到邮箱?所谓的打包,就是需要你把大量照片文件变成一个压缩文件,类似于放到一个文件夹内,也可以理解为把多张纸质照片装订成一个相册,而在装订过程中需要相应工具才能完成。使用压缩包发送文件&a…

dram sram利用 利用_使用量子力学技术的新型超低功耗存储器或将取代DRAM和Flash...

雷锋网按:业界普遍认为未来从数据中将能挖掘出最大的价值,但要挖掘数据的价值除了需要很强的计算能力之外,数据的存储也非常关键。目前,新型存储器也是领先的企业非常关注的一个方向,兰开斯特大学(Lancaster Universit…

mac地址转换_mac电脑格式转化工具

软件下载【软件名称】:Permute【系统支持】:MAC电脑【位数支持】:32位/64位软件下载地址:链接:https://pan.baidu.com/s/1OAEpnvmkQgqd9MMq3Rucow提取码:tgt7注:阿狸提供用户下载的所有内容均来…

电脑怎么打出冒号符号_Mac小技巧:教你如何在Mac电脑打出command?、option?等特殊符号...

很多Mac新用户不知道该如何打出command⌘、option⌥等特殊符号,而网上好多关于打出Mac特殊符号的教程已经过期,或者繁琐看不懂。今天为大家分享一份简单,一看就懂的Mac电脑怎么打出command⌘、option⌥等特殊符号教程。1.我们打开系统偏好设置…

arraylist下标从几开始_漫画:为什么计算机从 0 开始计数,而不是从 1 开始?

作者 | 漫话编程来源 | 漫话编程当我们想要写一个循环体&#xff0c;期望执行10次的时候&#xff0c;我们会使用以下方式&#xff1a;for (int i0; i<10; i){}可以看到&#xff0c;为了保证循环10次&#xff0c;我们定义了一个整数变量从0开始。还有&#xff0c;当我们定义数…

爱思助手短信备份到安卓_爱思备份短信 爱思助手备份短信

爱思助手有全部备份跟分类备份~可以备份的有1、iTunesStore和AppStore中的内容(包括所有已安装的APP)&#xff0c;或是直接下载到iBooks的PDF(您可以按照“传输iTunes中的购买项目”中所述来备份这些内容。)2、从iTunes同步而来的内容&#xff0c;如导入的MP3或CD、视频、图书和…

python 爬虫代码_Python 你见过三行代码的爬虫吗

Python 使用Lassie库&#xff0c;仅编写三行代码就能爬取静态页面上的图片和视频。Python实战教程每次讲爬虫的时候都会从“发送请求” 开始讲&#xff0c;讲到解析页面的时候可能大部分读者都会卡住&#xff0c;因为这部分确实需要一点XPATH或者CSS选择器的前置知识。那么有没…