天道酬勤,学无止境

Getting an error EOF : Command no found when using ssh

I am trying to rename the filenames in remote server like filename-dirname.suffix and copy the files to my server . I had written code like ....

  #!/usr/bin/bash
  TRANSFERSERVERXMLS="/emp/transfer/XMLS"
  REMOTESERVERXMLS="remoteemp/empdir/XMLS"

  # renaming the filenames in remote server like filename-dirname.suffix  
  ssh abc@xyz REMOTESERVERXMLS=$REMOTESERVERXMLS 'bash -s'<< 'EOF'

  for i in $REMOTESERVERXMLS/* ; do 
     if [[ -d $i ]]; then
            dirname=$(basename $i)
                     for j in $REMOTESERVERXMLS/$dirname/* ; do

                               fname="$(basename "$j")"

                               prefix=$(echo $fname | awk -F "." 'NF{NF-=1};1')
                               suffix=$(echo $fname | awk -F "." '{print $NF}')

                               target=$prefix-$dirname.$suffix

                                mv $REMOTESERVERXMLS/$dirname/"$fname" $REMOTESERVERXMLS/$dirname/"${target// /_}"
                          done
    fi
  done
  EOF
 scp abc@xyz:${REMOTESERVERXMLS}/*/* ${TRANSFERSERVERXMLS}

Getting an error : EOF:Command not found and scp is not working ( not able to copy into calling server)

标签

评论

You have a space before the delimiter EOF. Do not indent EOF at the end of your "here document". The delimiter (EOF) must be the only thing on the line, with no leading or trailing whitespace.

Alternatively use <<- 'EOF' and indent with a tab.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用 Python 通过 ssh 在远程主机上执行本地 shell 函数(Executing a local shell function on a remote host over ssh using Python)
    问题 我的.profile定义了一个函数 myps () { ps -aef|egrep "a|b"|egrep -v "c\-" } 我想从我的 python 脚本中执行它 import subprocess subprocess.call("ssh user@box \"$(typeset -f); myps\"", shell=True) 返回错误 bash: -c: line 0: syntax error near unexpected token `;' bash: -c: line 0: `; myps' 逃跑; 结果是 bash: ;: command not found 回答1 script=''' . ~/.profile # load local function definitions so typeset -f can emit them ssh user@box ksh -s <<EOF $(typeset -f) myps EOF ''' import subprocess subprocess.call(['ksh', '-c', script]) # no shell=True 这里有一些相关的项目: 在运行 typeset typeset -f以通过网络转储函数定义之前,需要在本地调用定义此函数的点文件。 默认情况下,非交互式 shell
  • 如何在 POSIX shell 中迭代双引号字符串?(How to iterate over double-quoted strings in POSIX shell?)
    问题 在我的脚本继续其主要工作之前,我试图检查我的脚本所依赖的所有非 POSIX 命令是否都存在。 这将帮助我确保我的脚本以后不会因为缺少命令而产生错误。 我想将所有此类非 POSIX 命令的列表保存在一个名为DEPS的变量中,以便随着脚本的发展和依赖更多命令,我可以编辑此变量。 我希望脚本支持其中包含空格的命令,例如my program 。 这是我的脚本。 #!/bin/sh DEPS='ssh scp "my program" sftp' for i in $DEPS do echo "Checking $i ..." if ! command -v "$i" then echo "Error: $i not found" else echo "Success: $i found" fi echo done 但是,这不起作用,因为在for循环迭代时, "my program"被拆分为两个词: "my program"如下面的输出所示。 # sh foo.sh Checking ssh ... /usr/bin/ssh Success: ssh found Checking scp ... /usr/bin/scp Success: scp found Checking "my ... Error: "my not found Checking program"
  • 伪终端将不会被分配,因为stdin不是终端(Pseudo-terminal will not be allocated because stdin is not a terminal)
    问题 我试图编写一个Shell脚本,该脚本在远程服务器上创建一些目录,然后使用scp将文件从本地计算机复制到远程服务器上。 这是我到目前为止的内容: ssh -t user@server<<EOT DEP_ROOT='/home/matthewr/releases' datestamp=$(date +%Y%m%d%H%M%S) REL_DIR=$DEP_ROOT"/"$datestamp if [ ! -d "$DEP_ROOT" ]; then echo "creating the root directory" mkdir $DEP_ROOT fi mkdir $REL_DIR exit EOT scp ./dir1 user@server:$REL_DIR scp ./dir2 user@server:$REL_DIR 每当我运行它时,我都会收到以下消息: Pseudo-terminal will not be allocated because stdin is not a terminal. 脚本将永远挂起。 我的公钥在服务器上是受信任的,我可以在脚本之外运行所有命令。 有任何想法吗? 回答1 尝试使用ssh -t -t (或ssh -tt为ssh -tt )来强制进行伪tty分配,即使stdin不是终端。 另请参阅:终止由bash脚本执行的SSH会话
  • 远程主机上的Bash命令替换(Bash command substitution on remote host [duplicate])
    问题 这个问题已经在这里有了答案: 如何为<< EOF >>包含代码的文件添加目录? (4个答案) 5年前关闭。 我正在尝试运行一个SSH到远程主机上的bash脚本,并停止正在运行的单个docker容器。 #!/usr/bin/env bash set -e ssh <machine> <<EOF container=$(docker ps | awk 'NR==2' | awk '{print $1;}') docker stop $container EOF 但是,出现以下错误: stop.sh: line 4: docker: command not found 当我手动执行此操作(通过SSH到计算机上,运行命令)时,一切都很好,但是当尝试通过脚本执行操作时,我得到了错误。 我猜我的命令替换语法不正确,我已经搜索并尝试了各种引号等,但无济于事。 谁能指出我要出问题的地方? 回答1 在启动您的heredoc时,请使用<<'EOF' (或<<\EOF仅引用第一个字符将具有相同的效果),以​​防止对其扩展进行本地评估。 顺便说一句,我个人会这样写: #!/bin/sh -e ssh "$1" bash <<'EOF' { read; read container _; } < <(docker ps) docker stop "$container" EOF
  • 用expect脚本实现自动化交互(包含几个经典例子)
    expect是建立在tcl基础上的一个工具,它用来让一些需要交互的任务自动化地完成。 因为expect是基于tcl的,所以需要你的系统中安装有tcl 用法 1. [#!/usr/bin/expect] 这一行告诉操作系统脚本里的代码使用那一个shell来执行。这里的expect其实和linux下的bash、windows下的cmd是一类东西。 ***注意:这一行需要在脚本的第一行。 2. [set timeout 30] 设置超时时间,计时单位:秒。timeout -1 为永不超时,默认情况下,timeout是10秒。 3. [spawn ssh -l username 192.168.1.1] spawn是进入expect环境后才可以执行的expect内部命令,如果没有装expect或者直接在默认的SHELL下执行是找不到spawn命令的。所以不要用 “which spawn“之类的命令去找spawn命令。 主要功能是用来开始一个新的进程 。 spawn后面加上需要执行的shell命令,比如说spawn sudo touch testfile. 4. [expect “password:”] 这里的expect也是expect的一个内部命令,功能是判断上次输出结果里是否包含“password:”的字符串,如果有则立即返回,否则就等待一段时间后返回,这里等待时长通过set
  • 在 python 中执行 bash 脚本(Executing a bash script in python)
    问题 我创建了一个 expect 脚本,当执行该脚本时,ssh 会连接到服务器并执行一系列命令。 伪代码如下所示: #!/usr/bin/expect spawn ssh usr@myip expect "password:" send "mypassword\n"; send "./mycommand1\r" send "./mycommand2\r" interact 当从 bash shell ($ ./myscript.txt) 执行时,代码执行良好。 我现在想做的是在 python 文件中有一行,它以与 bash shell 相同的方式运行脚本中的命令。 伪代码如下所示: import subprocess def runmyscript(): subprocess.call("myscript.txt", executable="expect", shell=True) def main(): run = runmyscript(): if __name__ == '__main__': main() 我已将 myscript.txt 脚本文件与 runmyscript.py 文件放在同一目录中,但是当我运行 python 文件时收到错误: WindowsError: [Error 2] The system cannot find the file specified
  • Shell - 通过expect工具实现脚本的自动交互
    开发中有没有碰到过输入一条命令后, 需要交互式输入其他指令, 才能真正执行完第一条命令? 比如远程ssh登录时, 需要输入yes, 然后输入密码的场景. 在自动化脚本中如何实现这种自动交互呢? 本篇博文通过对expect套件的介绍及演示, 解决这个问题.目录1 安装expect工具2 expect的常用命令3 作用原理简介3.1 示例脚本3.2 脚本功能解读4 其他脚本使用示例4.1 直接通过expect执行多条命令4.2 通过shell调用expect执行多条命令5 spawn not found 的解决参考资料版权声明1 安装expect工具expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是:spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成, 退出.由于expect是基于tcl的, 所以需要确保系统中安装了tcl:# 检查是否安装了tcl: [root@localhost ~]# whereis tcl tcl: /usr/lib64/tcl8.5 /usr/include/tcl.h /usr/share/tcl8.5 # 如果没有安装, 使用yum安装tcl和expect: [root@localhost ~]# yum
  • “command not found” errors in expect script executed by shell script
    I am trying to implement "shell script calling expect script" so that it does not prompt the user for entering ssh password every time. I started with Using a variable's value as password for scp, ssh etc. instead of prompting for user input every time and understood that I should have a .sh file and a .exp file. I have expect installed in my system (running expect -v shows expect version 5.43.0). In my upload-to-server.sh file I have cd $SOURCE_PATH/shell ./password.exp $DESTINATION_PATH $SSH_CREDENTIALS $PROJECT_INSTALLATION_PATH $PASSWORD And in my password.exp file I have #!/usr/bin/expect
  • 验证SSH上是否存在文件(Verify a file exists over ssh)
    问题 我正在尝试使用pexpect通过SSH测试文件是否存在。 我已经完成了大多数代码的工作,但是我需要捕获该值,以便可以断言该文件是否存在。 我做的代码如下: def VersionID(): ssh_newkey = 'Are you sure you want to continue connecting' # my ssh command line p=pexpect.spawn('ssh service@10.10.0.0') i=p.expect([ssh_newkey,'password:',pexpect.EOF]) if i==0: p.sendline('yes') i=p.expect([ssh_newkey,'password:',pexpect.EOF]) if i==1: p.sendline("word") i=p.expect('service@main-:') p.sendline("cd /opt/ad/bin") i=p.expect('service@main-:') p.sendline('[ -f email_tidyup.sh ] && echo "File exists" || echo "File does not exists"') i=p.expect('File Exists') i=p.expect('service
  • shell脚本执行的expect脚本中的“command not found”错误(“command not found” errors in expect script executed by shell script)
    问题 我正在尝试实现“shell 脚本调用期望脚本”,以便它不会每次都提示用户输入 ssh 密码。 我从使用变量的值作为 scp、ssh 等的密码开始,而不是每次都提示用户输入,并理解我应该有一个.sh文件和一个.exp文件。 我expect安装在我的系统中(运行expect -v显示expect version 5.43.0 )。 在我的upload-to-server.sh文件中,我有 cd $SOURCE_PATH/shell ./password.exp $DESTINATION_PATH $SSH_CREDENTIALS $PROJECT_INSTALLATION_PATH $PASSWORD 在我的password.exp文件中,我有 #!/usr/bin/expect -f set DESTINATION_PATH [lindex $argv 0]; set SSH_CREDENTIALS [lindex $argv 1]; set PROJECT_INSTALLATION_PATH [lindex $argv 2]; set PASSWORD [lindex $argv 3]; spawn scp $DESTINATION_PATH/exam.tar $SSH_CREDENTIALS':/'$PROJECT_INSTALLATION_PATH expect
  • 错误:RPC失败; 卷毛传输关闭,剩余未读数据(error: RPC failed; curl transfer closed with outstanding read data remaining)
    问题 当我尝试从GitLab(GitLab 6.6.2 4ef8369)克隆存储库时遇到此错误: remote: Counting objects: 66352, done. remote: Compressing objects: 100% (10417/10417), done. error: RPC failed; curl 18 transfer closed with outstanding read data remaining fatal: The remote end hung up unexpectedly fatal: early EOF fatal: index-pack failed 然后克隆被中止。 如何避免这种情况? 回答1 它经常发生,我的网络连接速度很慢,我必须克隆一个不错的git存储库。 最常见的问题是连接关闭,整个克隆被取消。 Cloning into 'large-repository'... remote: Counting objects: 20248, done. remote: Compressing objects: 100% (10204/10204), done. error: RPC failed; curl 18 transfer closed with outstanding read data remaining
  • python pexpect: SSHing then updating the date
    I have finally have my python pexpect script working except for the most important part updating the date! I am able to SSH in the box but my second command does not execute properly. I have been banging my head on the wall trying to figure out why. I have checked the output of the sting and it should be working based on whats coded. I am not a expert when it comes to python or pexpect so I am in need of a bit of help figuring out why my time is not updating. my original code: list = ["089"] sn = 0 ssh_new_conn = 'Are you sure you want to continue connecting' class ThreadClass(threading.Thread
  • 教你如何在Linux中通过expect工具实现脚本的自动交互
    导读expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 1 安装expect工具 expect是建立在tcl基础上的一个自动化交互套件, 在一些需要交互输入指令的场景下, 可通过脚本设置自动进行交互通信. 其交互流程是: spawn启动指定进程 -> expect获取指定关键字 -> send想指定进程发送指定指令 -> 执行完成, 退出. 由于expect是基于tcl的, 所以需要确保系统中安装了tcl: # 检查是否安装了tcl: [root@localhost ~]# whereis tcl tcl: /usr/lib64/tcl8.5 /usr/include/tcl.h /usr/share/tcl8.5 # 如果没有安装, 使用yum安装tcl和expect: [root@localhost ~]# yum install -y tcl [root@localhost ~]# yum install -y expect # 查看expect的安装路径: [root@localhost ~]# command -v expect /usr/bin/expect 2 expect的常用命令 命 令说 明spawn启动新的交互进程, 后面跟命令或者指定程序expect从进程中接收信息, 如果匹配成功
  • 如何在 Kubernetes 节点处于“未就绪”状态时进行调试(How to debug when Kubernetes nodes are in 'Not Ready' state)
    问题 我初始化了主节点并添加了 2 个工作节点,但是当我运行以下命令时,只显示主节点和其中一个工作节点: kubectl get nodes 此外,这两个节点都处于“未就绪”状态。 我应该采取哪些步骤来了解问题可能是什么? 我可以ping通其他每个节点的所有节点。 Kubernetes 的版本是 1.8。 操作系统是 Cent OS 7 我使用以下 repo 来安装 Kubernetes: cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://yum.kubernetes.io/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 EOF yum install kubelet kubeadm kubectl kubernetes-cni 回答1 首先,描述节点并查看它是否报告任何内容: $ kubectl describe nodes 寻找条件、容量和可分配的: Conditions: Type Status ---- ------ OutOfDisk False MemoryPressure False DiskPressure False Ready True Capacity
  • 如何在 ssh 命令中使用长输入参数正确转义 qsub 命令?(How to properly escaping qsub command with long input args within ssh command?)
    问题 我有一个复杂的 qsub 命令可以远程运行。 PROJECT_NAME_TEXT="TEST PROJECT" PACK_ORGANIZATION="--source-organization \'MY, ORGANIZATION\'" CONTACT_NAME="--contact-name \'Tom Riddle\'" PROJECT_NAME_PACK="--project-name \"${PROJECT_NAME_TEXT}\"" INPUTARGS="${PACK_ORGANIZATION} ${CONTACT_NAME} ${PROJECT_NAME_PACK}" ssh mycluster "qsub -v argv="$INPUTARGS" -l walltime=10:00:00 -l vmem=8GB -l nodes=1:ppn=4 /myscript_path/run.script" 问题是远程集群无法识别 qsub 命令,它总是显示不正确的 qsub 命令,或者只是因为输入参数错误而总是在集群上排队。 一定是转义问题,我的问题是如何正确转义上面的命令? 回答1 尝试使用here-doc执行此操作:您有引号冲突(嵌套双引号是错误): #!/bin/bash PROJECT_NAME_TEXT="TEST PROJECT" PACK
  • 推送时,Git推送失败并显示“致命:早期EOF”,但仅在一个文件上(Git push fails with “fatal: early EOF” when PUSHing but only on one file)
    问题 当我尝试将纹理和文本文件添加到我的仓库中时,所有方法都可以正常工作,但是当我尝试添加.blend文件时,出现此错误。 我已经尝试过在这里和Google上找到的一堆东西,但都没有(全部用于克隆/拉命令) 我使用的是Tortoise git 1.7.8和Git 1.7.10 msysgit-在最新版本失败后,我更改为它们。 其他人将东西推送到仓库没有问题,但是我没有将.blend文件发送给他们。 这是输出: Pushing to ssh://git@x.x.x:x/home/git/gitrepo Counting objects: 4, done. Compressing objects: 100% (3/3) Writing objects: 100% (3/3), 112.00 KiB | 116 KiB/s Writing objects: 100% (3/3), 113.07 KiB | 116 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) fatal: early EOF error: unpack failed: unpack-objects abnormal exit To ssh://git@x.x.x:x/home/git/gitrepo ! [remote rejected] master ->
  • 预期脚本中无法识别 eof(eof not recognized in Expect Script)
    问题 我的期望脚本中遇到了一些问题。 我正在生成 scp 文件上传,但无法识别 eof。 在脚本继续之前,期望遇到超时。 我究竟做错了什么?? 这是脚本 function ssh_upload_file () { test_log INFO "Uploading File $3 to Device $2 with a $1 seconds timeout" "ssh_upload_file" last_log_entry_to_detail expect <<- DONE set outfilename "$DETAIL_LOG" log_file "$DETAIL_LOG"; set timeout $1 set lantime_ip $2 system "touch ~/.ssh/known_hosts" system "ssh-keygen -R $2" spawn /bin/bash sleep 3 send_user "Uploading File via SSH...\n" send "scp $2 $3:$4 || echo FWTEST_SSH_RESULT=\$?\n" expect "assword:" { after 1000 send "$DUT_PWD\r" #set timeout 5 #expect "y/n" #send "n\n" #set
  • Bash command substitution on remote host [duplicate]
    This question already has answers here: How to cat <<EOF >> a file containing code? (4 answers) Closed 5 years ago. I'm trying to run a bash script that ssh's onto a remote host and stops the single docker container that is running. #!/usr/bin/env bash set -e ssh <machine> <<EOF container=$(docker ps | awk 'NR==2' | awk '{print $1;}') docker stop $container EOF However, I get the following error: stop.sh: line 4: docker: command not found When I do this manually (ssh to the machine, run the commands) all is fine, but when trying to do so by means of a script I get the error. I guess that my
  • git克隆时远端意外挂断(The remote end hung up unexpectedly while git cloning)
    问题 尝试克隆存储库一段时间后,我的git客户端反复失败并出现以下错误。 这可能是什么问题? 注意:我已经在GIT托管提供商处注册了我的SSH密钥 Receiving objects: 13% (1309/10065), 796.00 KiB | 6 KiB/s fatal: The remote end hung up unexpectedly 回答1 快速解决方案: 对于这种错误,我通常首先通过以下方式增加postBuffer大小: git config --global http.postBuffer 524288000 (下面的一些评论指出该值必须加倍): git config --global http.postBuffer 1048576000 (对于npm publish ,Martin Braun在评论中报告将其设置为不超过50000,而不是默认值1000000)。 ###更多信息: 在git config手册页中, http.postBuffer是关于: 将数据发布到远程系统时,智能HTTP传输所使用的缓冲区的最大大小(以字节为单位)。 对于大于此缓冲区大小的请求,将使用HTTP / 1.1和Transfer-Encoding: chunked来避免在本地创建大型打包文件。 默认值为1 MiB,足以应付大多数请求。 即使对于克隆,也可能会产生影响,在这种情况下
  • Kubernetes(5)——如何从零开始自己搭建一套K8S集群
    创建VM 无论以何种方式计算,首要都是搭建虚拟机。 我们以Centos7.6部署k8s v1.16.4高可用集群(主备模式)[1]为例: 1 部署环境 1.1主机列表 主机名 Centos版本 IP docker version flannel version Keepalived version 主机配置 备注 master01 7.6.1810 172.27.34.3 18.09.9 v0.11.0 v1.3.5 4C4G control plane master02 7.6.1810 172.27.34.4 18.09.9 v0.11.0 v1.3.5 4C4G control plane master03 7.6.1810 172.27.34.5 18.09.9 v0.11.0 v1.3.5 4C4G control plane work01 7.6.1810 172.27.34.93 18.09.9 / / 4C4G worker nodes work02 7.6.1810 172.27.34.94 18.09.9 / / 4C4G worker nodes work03 7.6.1810 172.27.34.95 18.09.9 / / 4C4G worker nodes VIP 7.6.1810 172.27.34.130 18.09.9 v0.11.0 v1.3.5