shell脚本远程链接执行脚本
前提:机器之间互联互通的,最好都配置了免密登录,不然的话会输入密码很麻烦
推荐使用第三种方式。
前两种方法的缺陷
启动后台进程:
ssh user@host ‘command1 &;command2‘;
有的会输出日志,占用终端,那么接下来的指令就不能用。采用输出重定向解决;
ssh user@host ‘command1 & >> file;command2‘;
这样有个缺点,就是输出到日志文件之后,有的进程还是会占有shell脚本,无法执行command2,而且如果执行命令比较多,非常乱。
第三种方式
这种方式就好像在命令行中一行一行执行,并且不会乱,首选第三种。
ssh user@host << EOF
command1
command2
commandx >> file & // 这样就不会占有终端,继续执行下面的指令
command3
command4
EOF
Pseudo-terminal will not be allocated because stdin is not a terminal.
可能还会碰见这个问题。字面意思是伪终端将无法分配,因为标准输入不是终端。虽然没什么影响,但是很烦。具体原理没有深究,两种解决解决方法:
方法1 :每个终端都打印出执行的命令,这种看着也乱,使用第二种
ssh -t -t user@host << EOF
command1
command2
command3
command4
EOF
方法2 :直接及解决
ssh -Tq user@host << EOF
command1
command2
command3
command4
EOF
SSH远程环境变量和命令无法找到
SSH远程执行脚本报错"command not found",且环境变量不生效,原因是之前将环境变量配置在了/etc/profile中,但是SSH远程执行脚本时实际上执行的是non-login shell,而non-login shell不会读取/etc/profile配置文件。
login shell和non-login shell
- 用SSH客户端(比如Putty)登陆Linux系统时,要求输入用户名/密码登录或根据SSH key登录时,就是login shell。
- 而在A机器上再用SSH免密码登录B机器,在B机器上执行Shell脚本,就是non-login shell。不会读取/etc/profile,shell脚本使用这种方法也属于non-login shell
login shell和non-login shell读取的环境变量配置文件
login-shell读取环境变量配置文件:
/etc/profile
~/.bash_profile
~/.profile
~/.bashrc
/etc/bashrc
non-login shell读取环境变量配置文件:
/etc/bashrc
~/.bashrc
远程执行多行命令涉及到的转义,命令转换
这里面涉及到的东西比较复杂和多
Here Document
一般来说ssh执行多行命令,或者cat执行多行文件,都会用到Here Document,但是呢,这里面分为两种情况:
如果是正常的
#!/bin/bash
id=1
ssh -Tq root@host << EOF // 代表会将其中用到的变量和命令在本地解析之后再传给远程主机执行
id=2
echo $id // id为1,在本地就解析了
EOF
如果不想做任何本地解析,就要加上\ , ’ ', 或者“ ” ,也就是\EOF,“EOF”,‘EOF’
#!/bin/bash
id=1
ssh -Tq root@host << 'EOF' // \EOF,"EOF",'EOF',代表这些命令行在本地不做任何解析,在远程才开始解释
id=2
echo $id // id为2,传过去,再继续解析的
EOF
近期发现,Here Document远程执行命令时无法用执行cat,more,less,head命令打印文件赋值给变量的操作,但是Here Document加上’ '单引号就可以
ubuntu执行sudo命令
一般来说,登录机器用自己的用户名,执行sudo命令会出现没有sudo的权限,这就是使用,所以需要将用户名加入sudo权限才可以
在远程机器上执行
sudo visudo
在文件最后一行添加:
$username ALL=(ALL:ALL) NOPASSWD:ALL
这一般是集群管理员干的事儿,但是的ubuntu系统还需要配置root用户,很不方便,而centos系统是自带的。