linux脚本运行后把脚本删了会怎么办
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux脚本运行后把脚本删了会怎么办相关的知识,希望对你有一定的参考价值。
您好,如果脚本运行后把脚本删了,那么可能会出现一些问题。首先,脚本删除后,可能会导致程序无法正常运行,因为脚本是程序的一部分,它包含了程序的指令和语句,如果脚本被删除,程序就无法正常运行。其次,脚本删除后,可能会导致数据丢失,因为脚本中可能包含了一些数据,如果脚本被删除,这些数据也会被删除,从而导致数据丢失。此外,脚本删除后,可能会导致程序安全性降低,因为脚本中可能包含了一些安全控制,如果脚本被删除,这些安全控制也会被删除,从而导致程序安全性降低。因此,建议您在删除脚本之前,先考虑清楚,以免造成不必要的麻烦。 参考技术A 工作中经常会遇到,在执行一个脚本时后,觉得有些地方要补充,而这个脚本又已经运行了一段时间,如果从头再来很浪费时间,这时如果能修改这个运行中的脚本就方便多了。如:
cat test.sh
#!/bin/bash
echo 1111
sleep 60
echo 2222
当开始运行后,如果想修改第二个echo的输出值,怎么办?
直接打开test.sh修改肯定是不行的,这就好比,一个运行中的脚本,你把文件删除了之前,脚本依然可以运行下去一样。这是因为,此时的脚本已经放在了内存里。所以要想修改脚本只能去内存里修改。linux很方便的可以看到内存里的文件(/proc目录下)。
通过:
[[email protected] tmp]# ps aux |grep
test.sh
root 27887
0.0 0.4 4492 1100 pts/0
S 10:20 0:00 sh test.sh
找到进程的pid,然后查看pid所对应的文件描述符:
[[email protected] tmp]# cd
/proc/27887/fd
total 0
lrwx------ 1 root root 64 May 8 10:21 0
-> /dev/pts/0
lrwx------ 1
root root 64 May 8 10:21 1 -> /dev/pts/0
lrwx------
1 root root 64 May 8 10:20 2 -> /dev/pts/0
lr-x------
1 root root 64 May 8 10:21 255 -> /var/tmp/test.sh
这里的255对应的文件就是我们的脚本,在这里直接编辑255这个文件
#!/bin/bash
echo
111111
sleep
60
echo 333333
修改后保存退出,此时就会执行修改后的脚本了。
要注意一点,如果是直接修改原脚本文件会出现什么结果呢?
当改完后,再看fd下的文件,会发现:
[[email protected] fd]# ll
total
0
lrwx------ 1 root root 64 May 8 10:27 0 ->
/dev/pts/0
lrw 参考技术B 当你在 Linux 上执行脚本后,如果把脚本删除了,那么你就没办法再次运行该脚本了。如果你需要重复使用该脚本,你应该将它保存,而不是把它从系统中删除。 参考技术C 如果Linux脚本运行后被删除,那么系统将不会再次运行该脚本,除非重新安装或重新创建该脚本。 参考技术D 如果脚本被删除,则无法再次运行该脚本,除非重新创建该脚本。
如果脚本被删除,则无法再次运行该脚本,除非重新创建该脚本。
linux脚本实现自己主动输入password
使用Linux的程序猿对输入password这个举动一定不陌生,在Linux下对用户有严格的权限限制,干非常多事情越过了权限就得输入password。比方使用超级用户运行命令,又比方ftp、ssh连接远程主机等等,例如以下图
那么问题来了。在脚本自己主动化运行的时候须要输入password怎么办?比方你的脚本里有一条scp语句。总不能在脚本运行到这一句时手动输入password吧
针对于ssh或scp命令。可能有人会回答是建立信任关系,关于建立ssh信任关系的方法请自行百度Google。仅仅须要两行简单的命令就可以搞定,但这并非常规的解决方式,假设是ftp连接就没辙了,况且。你不可能为了运行某些命令去给每一个你要连接的主机都手动建立ssh信任。这已经偏离了今天主题的本意。今天要说的是在脚本里自己主动输入password,我们能够想象下,更优雅的方式应该是在脚本里自己配置password。当屏幕交互须要输入时自己主动输入进去,要达到这种效果就须要用到expect
安装
CentOS下安装命令非常easy,例如以下
sudo yum install expect
至于Mac用户,能够通过homebrew安装(须要先安装homebrew。请自行Google)
brew install expect
測试脚本
我们写一个简单的脚本实现scp复制文件,在脚本里配置password。保存为scp.exp例如以下
#!/usr/bin/expect set timeout 20 if { [llength $argv] < 2} { puts "Usage:" puts "$argv0 local_file remote_path" exit 1 } set local_file [lindex $argv 0] set remote_path [lindex $argv 1] set passwd your_passwd set passwderror 0 spawn scp $local_file $remote_path expect { "*assword:*" { if { $passwderror == 1 } { puts "passwd is error" exit 2 } set timeout 1000 set passwderror 1 send "$passwd\r" exp_continue } "*es/no)?*" { send "yes\r" exp_continue } timeout { puts "connect is timeout" exit 3 } }
注意,第一行非常重要,通常我们的脚本里第一行是#!/bin/bash
,而这里是你机器上expect程序的路径,说明这段脚本是由expect来解释运行的,而不是由bash解释运行。所以代码的语法和shell脚本也是不一样的,当中set passwd your_passwd
设置成你自己的password,然后运行例如以下命令
./scp.exp ./local_file [email protected]:/xx/yy/
运行前确保scp.exp有运行权限,第一个參数为你本地文件。第二个为远程主机的文件夹,运行脚本假设报错“connect is timeout”,能够把超时设长一点。第二行set timeout 20
能够设置超时时间。单位是秒。脚本运行效果例如以下
还能做什么
细心的同学一定发现了,事实上expect提供的是和终端的一种交互机制,输入password仅仅是当中一种应用形式,仅仅要是在终端堵塞须要输入时,都能够通过expect脚本完毕自己主动输入,比方前面脚本里配置了两种交互场景。一种是终端提示"password:"时输入password。另一种是提示"yes/no)?
"时输入“yes”,假设和远程主机是第一次建立连接。运行scp.exp脚本效果是这种
所以我们能够依据终端的提示来配置输入命令。这样就能达到了自己主动化的效果。至于处理其他交互场景,仅仅须要照着上面的脚本依葫芦画瓢即可了
以上是关于linux脚本运行后把脚本删了会怎么办的主要内容,如果未能解决你的问题,请参考以下文章