问题描述

先描述一下,当前的一些状态、问题以及出现问题的原因,这有助于寻找解决方案。

  • 非root用户(如果是root用户,可能有更简洁/暴力的解决方案)。
  • 使用xshell登录服务器(已配置好的节点、端口、用户名、密码),可正常登录(默认进入到/home/user目录下)。
  • 使用ls命令,没有任何反应(就像卡死的状态)。但是,在使用TAB键(补齐作用)寻找路径时,可看到路径。比如:ls /home/username/ 命令输入后,按Tab键可看到该目录下的文件(包含.bashrc)。尝试了其他基础命令cp, mv, cat, cut也不能对任何文件进行操作。
  • 影响这些命令的原因是:.bashrc配置文件中,sourceexport了一些有问题路径:当前有问题/不能访问的服务器对应的路径。⭐️
  • 既然知道原因,那么解决方案就是:去掉 那些有问题的路径就可以了。😃
  • 但,问题是:.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

执行后vivim命令如果可操作,则直接修改编辑.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

只能等再次遇到这种情况时再测试了。。。


<完>

Logo

更多推荐