这个问题让我想起了我自己的一个问题。我想为机器创建一个别名ssh,运行一个命令(在这种情况下,cd到一个提供的路径),然后给我一个 shell。我已经运行了一百个变体:
$ ssh user@machine 'cd /some/path/ && bash -i -l'
Run Code Online (Sandbox Code Playgroud)
这是我能做的最好的事情。它在正确的目录中给了我一个 bash 提示,但没有作业控制,也不能使用箭头键(和其他一些快捷方式)。是否有捷径可寻?
我不能在 bashrc 或配置文件的末尾轻松地做到这一点,因为我想去的路径会有所不同(我会将它作为参数传递给别名),有时,我什至会 ssh 到那台机器根本不想去任何奇怪的地方 - 主目录很好。
我有一个用 utf8 编码的 bash 脚本。
在脚本中,我使用 sed 命令§作为分隔符。
现在,当我运行执行此脚本时会sed抱怨分隔符。
如果我使用普通字符作为 ex 的分隔符,@那么一切正常。
我已经在 putty[set utf8 in putty] 中查看了脚本,并且字符看起来很好。
还有来自locale命令的Linux 默认字符集显示
LC_CSET=en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)
可能出了什么问题?
早些时候,我曾经对 shell 脚本使用 windows-1252 编码,这曾经有效。
这是一个很难解释的问题,当使用 bash shell 连接到我的一台服务器时,在任何用户下,换行符都被破坏并且有各种各样的问题。其中一次我在下面的屏幕截图中详细说明:



我遇到的其他问题包括 nano 对我所在的行和/或字母感到非常困惑,如在 nano 中键入相同的消息所示:

这些问题仅在我之前提到的连接到运行 CentOs 的服务器时才会出现。你知道为什么会发生这种情况以及我能做些什么来解决它吗?在其他服务器上,消息工作正常!

谢谢你的时间,
请求命令的输出:
无法正常工作的服务器:

工作服务器:

它可能是非工作服务器上的自定义提示吗?在 .bashrc 中
PS1='\e[1;32m\u@\h\e[m:\e[1;34m\w\e[m$ '
Run Code Online (Sandbox Code Playgroud)
对此进行评论似乎可以解决问题。
谷歌表示,如果不遵守这些规则,可能会出现换行错误
use the \[ escape to begin a sequence of non-printing characters,
and the \] escape to signal the end of such a sequence
Run Code Online (Sandbox Code Playgroud)
我不确定这适合我的提示吗?
如果我想监控一些我不是主要维护者的机器(即,我无权访问安装包),是否有像 Nagios 这样的轻量级替代品?我正在寻找一个脚本(bash、Perl、PHP 等),它可以对 Linux 服务器和服务(磁盘空间、Web 服务器、可能是 CPU 使用率等)进行基本监控,并在必要时发送警报。
我在生产中有一堆 *nix 服务器。我想把它的重要配置文件放在版本控制中
我的基本想法是
放置分布式版本控制系统,以便每个系统的配置都保存在自己的驱动器上。
更改配置的方式是通过编辑器或通过外部源。
假设在 shell 中使用了 $EDITOR,则可以在保存文件时添加一个额外的命令(因此该文件随后会被添加到 git 中)。这可能有问题,因为用户并不总是会执行 vim /etc/my.cnf ,它可能会从 vim 中打开 my.cnf
另一个更改源可以通过 cron 脚本捕获,该脚本每隔一小时运行一次,并向版本控制添加内容(这已经足够了)。然后可以将 git repo 拉到一个中央位置进行保管。1 小时就足够了,因为假设第一种捕获更改的方法在大多数情况下都有效。
我想知道是否有一些工具可以做到这一点(或者做得更好)。理想情况下,在用户发起的每次配置更改时,他/她都被支持将更改添加到本地存储库中。
我正在一家软件公司实习,但我遇到了一些困难。这是交易:
问题:我们这里有一些盒子被错误地分区为 2 x 500 GB 驱动器。实际驱动器是 2 x 1 TB 驱动器。这些基本上是只使用了一半可用磁盘空间的机器。我的任务是编写一个脚本来重新分区这些驱动器。
迄今为止的解决方案:我有一个脚本可以禁用所有进程并重新启动,然后是另一个修复分区的脚本。问题是数据丢失。
我在寻找什么:我需要一个解决方案来执行此操作但保存所有数据。我的第一个虽然是将分区增加到适当的大小,但我不确定这是否可行。另一种解决方案是将所有数据复制到 Disk2 上,对 Disk1 进行分区,然后将数据移回 Disk1,最后对 Disk2 进行分区。问题是我对 Linux 还很陌生,我真的不知道该怎么做。我可以访问 fdisk 实用程序和 parted 实用程序。
它们都是 ext3 类型。
编辑:11/3/11
好的。所以我在两个磁盘上都有大约 1GB 未使用的未分配空间。我想做如下:
假设您有目录 ~/mytool 软链接到 /usr/local/mytool。然后cd mytool将当前目录保留为 ~/mytool,这可能会导致脚本行为不正确。有没有办法避免这种行为?
通过一些谷歌搜索,我发现您可以按如下方式实现:
cd $1 ; cd `pwd -P`
Run Code Online (Sandbox Code Playgroud)
没有切换到'cd'吗?环境变量?
我正在尝试删除所有不以__. 这个
ls | grep -v "__" | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)
产量: File name too long。有什么帮助吗?
编辑:
ls | grep -v "__" | awk '{print("rm \42"$0"\42")}' | /bin/bash
Run Code Online (Sandbox Code Playgroud)
解决了问题,但我想知道为什么第一个不正确。谢谢
我有以下shell脚本
$cat capture.sh
TIME=$(date +"%H-%M-%d-%m-%y")
IP="203.208.198.29"
PREFIX=$TIME$IP
tshark -f "udp" -i eth0 -w /root/captures/$PREFIX.cap&
pid=$!
sleep 2m
kill $pid
Run Code Online (Sandbox Code Playgroud)
当我从 shell 执行它时它运行良好。
但是当我将它添加到 cron 选项卡时,什么也没有发生。
我的 crontab 条目:1 */2 * 2 3,4,5 sh /root/capture.sh
tail /var/log/cron
Run Code Online (Sandbox Code Playgroud)
显示命令已执行。
但什么也没有发生。我已经为 capture.sh 设置了“all”的可执行权限,并为 /root/captures 目录设置了“all”的写权限。
提前致谢
当我通过 ssh 向远程服务器发送命令时,它们之间的区别是什么:
ssh user@123.456.789.012 'foo'
Run Code Online (Sandbox Code Playgroud)
和
ssh user@123.456.789.012 "foo"
Run Code Online (Sandbox Code Playgroud)
我没有传递任何变量,并且在远程运行命令时得到不同的结果。