【linux】bashrc配置文件里的source路径有问题解决
这个可能就涉及这个source原理了,由于不清楚,登录后source的配置信息和bashrc中的配置信息的先后关系,多次source指定的文件都没有作用(这样的处理跟直接source可能是一样的)。开始试各种命令,看那个能用。值得注意的是,笔者是路径不能访问的问题,直接编辑都不能用。如果只是vi不能用,可以 试试cat,grep,sed之类的命令,如果可用,先grep出要修改内容,确认修改的行,使
问题描述
先描述一下,当前的一些状态、问题以及出现问题的原因,这有助于寻找解决方案。
- 非root用户(如果是root用户,可能有更简洁/暴力的解决方案)。
- 使用xshell登录服务器(已配置好的节点、端口、用户名、密码),可正常登录(默认进入到/home/user目录下)。
- 使用
ls
命令,没有任何反应(就像卡死的状态)。但是,在使用TAB键(补齐作用)寻找路径时,可看到路径。比如:ls /home/username/
命令输入后,按Tab键可看到该目录下的文件(包含.bashrc
)。尝试了其他基础命令cp, mv, cat, cut
也不能对任何文件进行操作。 - 影响这些命令的原因是:
.bashrc
配置文件中,source
、export
了一些有问题路径:当前有问题/不能访问的服务器对应的路径。⭐️ - 既然知道原因,那么解决方案就是:去掉 那些有问题的路径就可以了。😃
- 但,问题是:
.bashrc
文件路径不能访问。。。(就是vi/vim
编辑不了)。😦
如果.bashrc文件中,不小心写错了一些配置信息,也可能出现类似的问题。只是.bashrc文件访问没问题,但vi/vim不能用了。也编辑不了.bashrc。
注:由于自己对linux系统的一些底层原理并没有理解的很透彻,所以很多时候,都是在自己所认知的一个层面来说明问题,有些描述上并不专业。
解决过程
这部分可跳过,直接看后面的解决方法,这只是记录一下寻找答案的过程。
有一个快捷的方式,就是使用root直接修改自己的bashrc,但目前并没有root权限/密码。
网搜了很多相关问题,大多数的解决方法是:(然而这个方法对笔者不起作用)
执行如下命令:
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
然后修改编辑.bashrc文件中有问题的地方,最后再source .bashrc。
想到还有另外一个群组的普通用户userA
,可正常访问。该用户可构建镜像,想利用docker镜像并挂载当前可访问的盘,进行镜像后,可以root权限对挂载盘进行操作(需慎重)。可惜,用户 userA 不能访问 笔者默认用户的节点。即使能访问,也不能挂载/home目录吧?进入镜像后,用默认的/home目录,有冲突?还是放弃使用镜像操作吧!
不过,userA是可访问共用的一些路径,有助于后面的测试(userA是特殊场景下使用的用户,不能随便用)。
值得说明的是,使用xshell登录时,默认自动source
一下bashrc文件。有一个新的思路是,如何在登录时,source一个指定路径下的文件?网搜后,发现大部分问题及解决是说,每次登录都需要手动source,如何手动变自动。那反过来想就是笔者想自动变手动?
想自动source就是,在bashrc中添加了如下代码可实现:
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
就是说,不想自动source(手动source),把这几行代码注释掉,就不会在每次登录后自动source了。但是,又回到了一开始的问题,这个文件不能编辑。。。😦
换个思路,使用userA编辑了一个bashrc文件,内容是:
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
使用默认用户username进行source(想覆盖原理的.bashrc文件),结果并不起作用。这个可能就涉及这个source原理了,由于不清楚,登录后source的配置信息和bashrc中的配置信息的先后关系,多次source指定的文件都没有作用(这样的处理跟直接source可能是一样的)。还企图,搜索修改默认的source文件路径的方法(有点困难)。
开始试各种命令,看那个能用。mv/cp/cat/cut/sed。。。 咦,vi不能用,能不能用sed编辑?当然也不能。。。值得注意的是,笔者是路径不能访问的问题,直接编辑都不能用。如果只是vi不能用,可以 试试cat,grep,sed之类的命令,如果可用,先grep出要修改内容,确认修改的行,使用sed -i
直接修改(慎重,-i
参数直接修改文件)。举例:修改25行的axxx为xxx:
$ cat -n /home/username/.bashrc | grep 'xxx'
15 # this is xxx
19 source xxx
25 source axxx
# 慎重:-i直接修改文件内容,不加-i是标准输出
$ sed -i "25s/axxx/xxx/" /home/username/.bashrc
由于笔者这些命令是可用的,而对应的路径不能访问,上述命令均不能操作。网搜各种文件操作命令,提到使用echo(试了这么多命令,竟然没想到echo,大意了!!!)。发现echo的字符串是可以追加到一个文件中的(不理解:文件不能编辑,能直接追加内容)。例如:
echo "export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" >> /home/username/.bashrc
你可能会问,cat都用不了,你是怎么知道echo的内容追加成功了?别忘了我还有一个userA用户可以查看的。当然,没有这个userA用户,命令执行成功也能表示追加成功。
不过,我一开始没有用追加的方式修改.bashrc文件,折腾了半天,我只想删掉原来的bashrc 😡。所以就想直接用:
echo "" > /home/username/.bashrc
还是忍住了,添加了一些信息,使用这个命令重新生成bashrc:(慎重使用,这意味着删除你原来的bashrc文件,还是先尝试追加方式,如果不行再考虑重新生成)
echo -e "# .bashrc\n# Source global definitions\nif [ -f /etc/bashrc ]; then\n . /etc/bashrc\nfi" > /home/username/.bashrc
执行后,生成的一个新的bashrc文件内容是:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
至此,想到了一句话,高端的食材往往使用最朴素的烹饪方法。
---------------------废话结束-------------------
解决方法
方法1️⃣
自己搜索相关问题解决方案,网友也确实有很多网友有"类似"问题。最多的是针对配置文件修改并source后,很多命令不能使用的解决方法,大部分是执行如下类似的命令:(就是source了一些常见路径)
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
执行后vi
或vim
命令如果可操作,则直接修改编辑.bashrc文件中有问题的地方即可。修改后source一下:source /home/username/.bashrc
。
方法2️⃣
笔者执行了方法1️⃣没有作用,还不清楚是什么原因。还是使用了最简便的方式,用echo重新bashrc文件(前提是echo也是可以用的):
echo -e "# .bashrc\n# Source global definitions\nif [ -f /etc/bashrc ]; then\n . /etc/bashrc\nfi" > /home/username/.bashrc
请注意: 这个命令相当于直接将原来的.bashrc文件覆盖,就相当于删除重写的文件。source后,再重新登录就恢复到了原始状态。需要重新配置,比如:
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# User specific aliases and functions
alias mv='mv --suffix .mymv_bk'
alias cp='cp --suffix .mycp_bk'
alias les='less -S'
alias grep='grep --color=auto'
alias egrep='egrep --color'
alias tspawk="awk '{i=1; while(i<=NF){col[i]=col[i] \$i \"\t\";i=i+1}}END{i=1;while(i<=NF){print col[i];i=i+1}}'"
alias mywork='cd /test/workdir'
PS1="\[\e[31m\][\e[33m\]\u@\h \e[31m\]\w]\A\n$ \[\e[m\]"
export PAHT=/mysoftware/s1:$PATH
方法3️⃣
对于类似的问题,目前所处状态不同的用户(具体见第一部分的描述),解决方法不一定适用。根据方法2️⃣,可能更安全的修改方法,可以测试:(笔者没有测试过,只是参考方法2,进行追加而不是删除,如果不行再使用方法2)
使用echo
追加">>"方法1️⃣中的命令到bashrc中并进行source:
echo "export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin" >> /home/username/.bashrc
# source bashrc文件
source /home/username/.bashrc
然后关闭所有登录窗口,重新登录。保证默认source了bashrc文件,如果默认不source,添加这些代码到bashrc中再source试一下:
echo -e "# .bashrc\n# Source global definitions\nif [ -f /etc/bashrc ]; then\n . /etc/bashrc\nfi" >> /home/username/.bashrc
只能等再次遇到这种情况时再测试了。。。
<完>
更多推荐
所有评论(0)