我正在尝试通过读取块内的 nc 向 statsd 发送一个小字符串:
while read line; do
printf "folder.counter:value|1c" | nc -q 0 -u $host $port
done
Run Code Online (Sandbox Code Playgroud)
不幸的是,在 UDP 模式下, nc 似乎想无限期地等待,即使我已经指定了-q 0,手册页说这将使程序在 EOF 后立即退出。
我试过 pass -w 1,但是如果我发送的数据每秒超过一行,数据就会缓冲起来,我会丢失实时统计数据(更不用说冒某种缓冲区溢出的风险了)。
是否可以用 netcat 做我想要做的事情,还是我需要用具有 statsd 库的语言编写一些东西?
我有一个 Korn shell 脚本
#!/bin/ksh
# set the right ENV
case $INPUT in
abc)
export BIN=${ABC_BIN}
;;
def)
export BIN=${DEF_BIN}
;;
*)
export BIN=${BASE_BIN}
;;
esac
# exit 0 <- bad idea for sourcing the file
Run Code Online (Sandbox Code Playgroud)
现在这些 VAR 仅在子 shell 中导出,但我希望它们也设置在我的父 shell 中,所以当我在提示符下时,这些 var 仍然设置正确。
我知道
. .myscript.sh
Run Code Online (Sandbox Code Playgroud)
但是有没有办法在没有“采购”的情况下做到这一点?因为我的用户经常忘记“来源”。
EDIT1:删除“exit 0”部分 - 这只是我打字时没有先考虑
EDIT2:添加更多关于我为什么需要这个的细节:我的开发人员为(为了简单起见)2 个应用程序编写代码:ABC 和 DEF。每个应用程序都由不同的用户 usrabc 和 usrdef 在生产环境中运行,因此已经设置了他们的 $BIN、$CFG、$ORA_HOME 等等 - 特定于他们的应用程序。
所以
我曾经为一家公司工作,该公司有一个定制的 shell 来管理他们在 Linux 上运行的一个产品,我希望复制这个 shell 的一个关键特性。
所有工作都由后台进程完成,日志的输出显示给所有连接的用户。
日志会在你的 shell 的背景中拖尾,并且提示行将始终完美地停留在底部。
例如
Log line 1
Log line 2
Log line 3
![ROOT@PRODUCT51-LIVE]:~/ #
Run Code Online (Sandbox Code Playgroud)
我尝试使用 bash 执行此操作的方法是在用户 .bashrc 文件中启动一个分离的尾部,但是当命令的输出发送到 stdout 时 - 它出现在 bash 提示符下,例如
![ROOT@PRODUCT51-LIVE]:~/ #Log line 1
Log line 2
Log line 3
Run Code Online (Sandbox Code Playgroud)
并且用户必须按 Enter 或CtrlC获得干净的提示行。
我不知道如何让提示总是跳到输出的底部,我认为我使用错误的术语在谷歌上找到任何东西,因为我运气不好 - 有谁知道如何做到这一点用 bash 吗?
在大多数情况下,在 Linux 中进行递归/深层目录复制的一种好的通用方法是什么?我使用了简单的东西,比如cp -R相当复杂的cpio咒语。是否有任何显着的优势或劣势导致您偏爱其中一个?你最常使用哪一种?
我主要使用 Windows 安装的 Git vcs 附带的“git-bash”。我认为这与 Cygwin 附带的相同。它在技术上运行良好,但用户界面很糟糕:
相比之下,OS X 附带的终端应用程序可以从容地管理这些,并使其使用起来更加舒适。您甚至可以将文件拖放到其上,它会将文件路径粘贴到您的光标处!
我也试过:
http://sourceforge.net/projects/win-bashhttp://www.steve.org.uk/Software/bash/http://www.hamiltonlabs.com/cshell.htm这些都不会在没有繁琐的右键单击的情况下复制和粘贴文本。
我专门在 Windows 中寻找 Unix 风格的 shell,因此我不必在我的家庭开发人员 (Windows)、实时服务器 (Linux) 或办公室开发人员 (Mac) 之间使用不同的 shell。
是的,我已经用谷歌搜索过,但还没有找到...
我正在考虑将 SSH 隧道实现为一种廉价的 VPN 解决方案,供外部用户访问仅面向 Intranet 的 Web 应用程序。
我目前正在使用安装了 OpenSSH 的 Ubuntu Server 10.04.1 64 位。
我在 Windows 机器上使用 Putty 在本地端口上创建到我的 ssh 服务器的隧道。
start putty -D 9999 mysshserver.com -N
Run Code Online (Sandbox Code Playgroud)
然后我使用 tell Firefox 在 localhost:9999 上使用 SOCKS 代理。
-N 标志将从客户端禁用交互式 shell。有没有办法在服务器端做到这一点?
除了禁用 root 访问,使用 rsa 密钥认证,并更改默认端口;为此,我还应该遵循任何其他明显的安全实践吗?我的目标是简单地能够隧道网络流量。
这听起来可能有点矛盾,但我最近在尝试重建损坏的 RAID 阵列时需要使用单用户模式(又名维护模式)一段时间(几天!)。
在执行此操作时,我发现自己想要使用第二个 shell 进行诸如检查/编辑各种配置文件中的设置或查看系统日志之类的事情,而主(也是唯一的)控制台被捆绑执行一些恢复过程。
在另一个 tty 上启动第二个 shell 的推荐命令是什么?
显然,一种方法可能是screen在 tty1 中使用,但这并不像使用 Alt-F1、Alt-F2 等切换会话那么容易。
我可以访问一个以前设置的 FreeBSD 盒子,上面有许多监狱。其中一个监狱是一个 SQL 服务器,它没有启用 ssh。
如何从主机访问该监狱上的 shell?(我拥有它的 root 权限。)
rsync可以mv使用以下选项非常相似地将文件夹哄入移动文件夹中,并且优于传统文件夹:
rsync -axvvES --remove-source-files source_directory /destination/
Run Code Online (Sandbox Code Playgroud)
但是,我似乎还无法完成的一件事是删除原始目录。该--remove-source-files标志就是这样做的,删除源文件,但不删除源目录。我也希望有--remove-source-directories一面旗帜,但没有。
我该如何处理? 我想我可以rm -fr在移动后发出一个,但是我更愿意将整个过程保持在一个过程中,而不是引入潜在的错误。
隐藏 shell 命令的输出通常涉及重定向 stderr 和 stdout。是否有任何内置工具或命令在默认情况下隐藏输出但在错误时转储所有累积的输出?我想将它作为远程ssh命令的包装器运行。现在我让它们使用重定向,但我不知道是什么导致它们失败,而且它们太冗长了。
编辑:最后,我根据@Belmin 的回答创建了以下模板,我稍微调整了一下以从脚本中累积所有以前的命令,使用当前进程标识符,自动删除日志,并添加失败红色错误出现问题时的消息。在此模板中,初始silent包装器将成功,然后第三个命令失败,因为该目录已存在:
#!/bin/sh
set -e
SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT
function report_and_exit {
cat "${SILENT_LOG}";
echo "\033[91mError running command.\033[39m"
exit 1;
}
function silent {
$* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}
silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2
Run Code Online (Sandbox Code Playgroud)